protobuf的使用误区(cpp)
来源:互联网 发布:乐知英语好不好 编辑:程序博客网 时间:2024/06/10 05:30
根据我使用中发现的问题,protobuf的使用需要慎重使用ParseFromString来实现反序列化的。
有兴趣深究protobuf反序列化原理的兄台可以瞅瞅序列化之后的内容,好像是如下格式
一个字节的转译字符 | member name| member value
如果有一个memory buffer,现在需要反序列化为一个类,万不可使用ParseFromString,隐藏着潜在的bug。如果buffer中有非字符内容,肯定反序列化的结果是有问题的。截断的情况是隐藏的,视buffer内容而定,最关键的一点,发生截断的时候也没有异常。其场景如下代码(错误用法)
char * buf ;...获取内存快内容string str = buf ;proto.ParseFromString(str)
此时需要做如下的操作:
用memory buffer实例化stringstream对象,
调用stringstream的pubsetbuf(basebuf, length)函数将内存块填充进去,注意,此处不可以将buffer赋值给一个string对象,然后用string对象构造一个stringstream。这时候会发生截断。
看到github上面的很多人的使用都是错误的。本来想找一个epoll+protobuf的基础工程的代码的,看来这个工作还得自己去做。
其问题可以简化用以下代码描述。(错误用法)
char * buf ;...string str = buf ;stringstream s(str) ;proto.ParseFromIstream(s);
如下代码段的用法为正确用法
stringstream s;s.rdbuf()->pubsetbuf(buf, length);proto.ParseFromIstream(&s) ;
注意上面的length不能用strlen(buf)来获取。
0 0
- protobuf的使用误区(cpp)
- protobuf【1】详细的安装和使用(windows cpp)
- [ProtoBuf]ProtoBuf命令生成的Cpp文件分析
- c++使用Protobuf Message转Json字符串(Json库使用Json cpp)
- protobuf-c的使用(二)使用
- 【Google Protobuf】protobuf的使用(二)
- protobuf-c的使用(一)构建
- Google Protobuf的使用
- protobuf的使用初探
- ProtoBuf 的java使用
- protobuf的使用
- ProtoBuf 的java使用
- protobuf的使用
- ProtoBuf 的java使用
- protobuf 的java使用
- protoBuf的使用---java
- ProtoBuf 的java使用
- protobuf 的使用
- Activiti流程的CRUD(三)
- 1196:Lowest Bit
- POJ 3057 Evacuation 二分图
- mybatis 中#与$的区别
- setNeedsDisplay和layoutSubViews
- protobuf的使用误区(cpp)
- 理解和使用alsa配置-默认静音,必须先用amixer解除主音量和pcm音量的静音
- Android manifest文件中的标签详细介绍
- Kalman
- 基于JSR-WS的认证
- Leetcode Database - 我的汇总
- 单例模式
- hdu1045
- linux 下安装、使用 redis