打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
解决protobuf数据丢失bug

protobuf是Google开发的一个开源序列化框架,类似XML,JSON,其最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。但是,protobuf在使用当中也发现一些问题,数据在protobuf序列化后无法反序列化,或者丢失部分数据,这就与protobuf的目的违背。下面我们来看下这个问题吧。

首先定义一个protobuf结构,如下:

[plain] view plain copy
  1. message Person {  
  2.   required int32 mid = 1;  
  3.   required int32 type = 2;  
  4. }  
再来看下这段代码,看似没有问题:

  1. Person psn0;  
  2. psn0.set_mid(1);  
  3. psn0.set_type(0);  
  4.   
  5. string str0;  
  6. psn0.SerializeToString(&str0);  
  7.   
  8. // 由于网络传输, string 需要转换成 char*  
  9. const char* buf = str0.c_str();  
  10.   
  11. // 如果是这样解析,将会引起bug  
  12. string str1 = buf;  
  13.   
  14. People psn1;  
  15. bool ret1 = psn1.ParseFromString(str1);  
  16.   
  17. if (ret1)  
  18. {  
  19.     cout << "str1 parse success" << endl;  
  20. }  
  21. else  
  22. {  
  23.     cout << "str1 parse fail" << endl;  
  24. }  
  25.   
  26. // 这样解析不会引起bug  
  27. string str2;  
  28. str2.assign(buf, str0.length());  
  29.   
  30. People psn2;  
  31. bool ret2 = psn2.ParseFromString(str2);  
  32.   
  33. if (ret2)  
  34. {  
  35.     cout << "str2 parse success" << endl;  
  36. }  
  37. else  
  38. {  
  39.     cout << "str2 parse fail" << endl;  
  40. }  

运行结果,如下:

[plain] view plain copy
  1. str1 parse fail  
  2. str2 parse success  

这里解释一下原因:在以上例子中,protobuf 序列化的 string 数据里含有 '\0' 字符。如果以 char* 取protobuf序列化后的数据,将会丢失部分数据。

虽然这个严格意义来讲也不算protobuf的bug,但在protobuf的使用中一般很少人注意protobuf 的数据中带有 '\0' 字符,这就导致了bug的发生。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
vs2012 编译 并使用 google protobuf
Embedding Python in C++ Applications with boost::python
类内部存储的东西:太简洁了----小话c++(5)
被人误解的sizeof
C++算法面试题:写一个函数统计一个字符串中5个元音字母各自出现的次数,要求有适合的函数原型,可以使用辅助的自定义数据类型。
操作符优先级
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服