2015-11-03 59 views
0

我想在Windows平臺上序列化我的協議緩衝區消息,我的編碼語言是C++。序列化完成後,它返回「false」。請找到下面的代碼,並讓我知道我要去哪裏錯了。protobuf serializetocodedstream返回「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(); 

} 

回答

0

您分配等於消息(payload.ByteSize())的大小的緩衝區,但你試圖寫進去一個varint協議緩衝代碼其次是實際的消息。這大於消息大小。序列化失敗,因爲它的空間不足。

你應該這樣做:

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

此外,在一個不相關的音符,你在呼喚ByteSize()多次,因爲整個消息已被掃描,每次計數這是一種浪費。相反,您應該保留原始大小的副本以便重複使用。