protobuf serializetocodedstream返回“false”

时间:2015-11-03 06:53:27

标签: c++ qt protocol-buffers

我正在尝试在Windows平台中序列化我的协议缓冲区消息,我的编码语言是C ++。序列化完成后,返回“false”。请找到下面的代码,让我知道我哪里出错了。

原始文件

message mobile_list{    
required string name = 1;    
required DeviceType type = 2;    
required string imei = 3;    
required bytes wifiAddress = 4;    
optional bytes macAddress = 5;    
}  

协议缓冲区代码

#include <unistd.h>    
#include "mobile.pb.h"    
#include <iostream>    
#include <google/protobuf/message.h>    
#include <google/protobuf/descriptor.h>    
#include <google/protobuf/io/zero_copy_stream_impl.h>    
#include <google/protobuf/io/coded_stream.h>    
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>

using namespace google::protobuf::io;

using namespace std;
int main(int argv, char** argc){

mobile payload;
payload.set_name("Testing");
payload.set_type(mobile::Android);
payload.set_imei("123456");
payload.set_wifiAddress("96-00-OM-1E-4R-99");
payload.set_macAddress("96-00-OM-1E-4R-99");

int siz = payload.ByteSize();
char *pkt = new char [siz];
google::protobuf::io::ArrayOutputStream as(pkt,siz);
CodedOutputStream *coded_output = new CodedOutputStream(&as);
coded_output->WriteVarint32(payload.ByteSize());
payload.SerializeToCodedStream(coded_output);

return a.exec();

}

1 个答案:

答案 0 :(得分:0)

您正在分配一个等于消息大小(payload.ByteSize())的缓冲区,但是您尝试在其中写入varint,然后是实际消息。这总计超过了邮件大小。序列化失败,因为它用完了空间。

你应该这样做:

int siz = payload.ByteSize();
siz += CodedOutputStream::VarintSize32(siz);
// ... continue as before ...

此外,在一个不相关的注释中,您多次调用ByteSize(),这是浪费的,因为每次都必须扫描和计算整个邮件。相反,您应该保留原始大小的副本以供重用。