工作中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();