protobuf的使用误区(cpp)

根据我使用中发现的问题,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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值