Protobuf Serializetocodedstream 返回"false"

protobuf serializetocodedstream returns "false"

本文关键字:false 返回 Serializetocodedstream Protobuf      更新时间:2023-10-16

我正试图在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();
}

您正在分配一个等于消息大小的缓冲区(payload.ByteSize()),但随后您试图在其中写入一个后面跟着实际消息的变量。这加起来超过了邮件大小。由于空间不足,序列化失败。

你应该做:

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

此外,在一个无关的问题上,您多次调用ByteSize(),这是浪费,因为每次都必须扫描和计数整个消息。相反,您应该保留一份原始大小的副本以供重复使用。