Protobuf Serializetocodedstream 返回"false"
protobuf serializetocodedstream returns "false"
我正试图在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()
,这是浪费,因为每次都必须扫描和计数整个消息。相反,您应该保留一份原始大小的副本以供重复使用。
相关文章:
- QueryWorkingSet总是返回false
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 等于在 c++ 中返回 false
- strcmp 对于相等的字符序列返回 false
- C++ - 负数和正数之间的比较返回 false
- protobuf 的 ParseFromString 函数返回 false
- 递归函数始终返回 false
- 为什么 GetExitCodeThread() 在这里返回 FALSE?
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- MFC 的 OnInit() 函数中的返回 true 和返回 false 有什么区别
- if 语句在条件为真时返回 false
- 为什么 std::isnan() 对于具有 NAN 值的双变量返回 false
- is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false
- 在 winapi 回调函数上返回 FALSE 时出现意外行为(循环被跳过?
- 如果数组中有重复的数字,如何返回'false'?
- std::is_array 当它应该返回 false 时返回 true
- 为什么pyarg_parsetuple总是返回false
- 我想返回 True/False 关于值是否在一组值中
- 删除为应该在哈希表中的记录返回 false 的函数
- 具有自定义返回类型和"false"返回条件的函数?