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

 

定义的消息结构:

  1. 主文件 cs_msg.proto:  
  2.   
  3. message MsgBody  
  4. {  
  5.     // [19000, 19999]是protobuf预留  
  6.     extensions 100 to max;  //  max is 2^29 - 1 tags分配规则见下面  
  7. }  
  8.   
  9. 另外一个文件cs_auth.proto:  
  10.   
  11. import cs_msg.proto;  
  12. message SignReq  
  13. {  
  14.     required uint32 uid = 1;  
  15. }  
  16.   
  17. extend MsgBody  
  18. {  
  19.     optional SignReq sign_req = 201;  
  20. }  
主文件 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;
}

序列化:

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


反序列化

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


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

posted @ 2012-12-19 11:01  孤火  阅读(842)  评论(0编辑  收藏  举报