Protobuf的坑——解析的内容超出64M导致失败

 工作中Protobuf有两种常见用法:1,将数据序列化到buffer中,通过消息发送出去;2,将数据序列化到文件中,通过文件进行数据传递。在第一种使用场景下,一般都会注意到数据的大小,因为消息过大会导致发送和接收时处理多个分片,降低效率,几百KB就算多的了;而在第二种场景下不知不觉序列化后的文件就增长到了几十MB。


 肆意增大的文件导致解析时执行ParseFromString()失败。一开始没想到是数据太大导致的,反复调试才意识到是数据大小影响了解析结果。在网上搜索发现protobuf有一个默认大小限制,要解析的数据不能超过默认的64MB,超出后解析失败。我奢望着别的反序列化接口没有这个限制,但是事实证明parseFromArray()ParseFromFileDescriptor()都有这种问题。


 大家给出的解决办法就是通过CodedInputStream类的SetTotalBytesLimit()方法提高对数据大小的限制,此处仅以解析文件为例编写示例代码:


#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
DataProtoBuf::DataArray  dataArray;
int fd = open("data_paras", O_RDONLY);//文件 data_paras里记录了序列化的protobuf数据
 
::google::protobuf::io::FileInputStream input(fd));
::google::protobuf::io::CodedInputStream decoder(&input);
decoder.SetTotalBytesLimit(128*1024*1024, -1);//能解析的数据最大为128M

bool success = dataArray.ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage();



 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值