proto-gen AS3版本的protobuf extension反序列化错误解决方法

转载请注明:http://blog.csdn.net/herm_lib/article/details/8330493

前段时间用了 proto-gen AS3版本的 protobuf,用到了extension的时候,出事了,表现为,有时候反序列成功,有时候又失败,各种未定义行为。因为,先前用C++版本都很顺利,所以惯性上认为是自己代码有问题,然后各种排查,无果。然后,问同事,他们都没用到extension特性;网上查,按照proto-gen wiki上操作,不行。最后,就给pop_atry这哥们(中国人,好沟通)发邮件,原来这哥们wiki上的例子写错了,被坑了(开玩笑)。在这里,感谢pop_atry的回复。处理这个是问题有一段时间了,今天突然想到要写在blog上,让后来人得于立即解决这个问题,避免我当时解决问题的各种悲剧,浪费很多时间。

protobuf extension的使用方法请见:http://blog.csdn.net/herm_lib/article/details/7843560


定义的消息结构:

主文件 cs_msg.proto:

message MsgBody
{
    // [19000, 19999]是protobuf预留
    extensions 100 to max;  //  max is 2^29 - 1 tags分配规则见下面
}

另外一个文件cs_auth.proto:

import cs_msg.proto;
message SignReq
{
    required uint32 uid = 1;
}

extend MsgBody
{
    optional SignReq sign_req = 201;
}

序列化:

var mb:MsgBody = new MsgBody;
var singReq:SignReq = mb[SIGN_REQ];

反序列化

var mb:Msg = new MsgBody;
mb.MergeFrom(...);
void(SIGN_RES);   // 必须加一个这行
var singRes:SignRes = mb[SIGN_RES];

上面的void(SIGN_RES); 必须得加上,否则就会出现莫名其妙的解析结果。 这个用法很奇怪,我只用,但不知道什么原理。

你可能感兴趣的:(proto-gen AS3版本的protobuf extension反序列化错误解决方法)