Protocol buffers 当ParseFromArray在协议缓冲区中返回true时
我解析了协议缓冲区的协议,协议不缺少任何字段。但是ParseFromArray函数返回Protocol buffers 当ParseFromArray在协议缓冲区中返回true时,protocol-buffers,Protocol Buffers,我解析了协议缓冲区的协议,协议不缺少任何字段。但是ParseFromArray函数返回false。为什么? 我假设你使用C++。代码>ParseFromArray()在以下情况下失败: 输入数据不是有效的protobuf格式 输入数据缺少必填字段 如果您确定设置了所有必填字段,则输入数据一定已损坏。您应该验证传递到ParseFromArray()的字节和大小是否与从发送端的SerializeToArray()和ByteSize()获得的字节和大小完全相同。您可能会发现您正在丢失某些字节,或者
false
。为什么? 我假设你使用C++。代码>ParseFromArray()在以下情况下失败:
- 输入数据不是有效的protobuf格式
- 输入数据缺少必填字段
ParseFromArray()
的字节和大小是否与从发送端的SerializeToArray()
和ByteSize()
获得的字节和大小完全相同。您可能会发现您正在丢失某些字节,或者某些字节已损坏
腐败的常见原因包括:
- 通过纯文本通道传递编码的字节。例如,如果您将数据写入(或从中读取)未以“二进制”模式打开的文件,或者如果您在某个时候将字节存储在Java
字符串中,数据将被破坏,因为这些通道需要文本,而编码的协议不是文本
- 将字节作为
传递,即假定NUL终止。编码的protobufs可以包含字符*
字节,这意味着不能单独将一个字节表示为'\0'
——必须单独包含大小char*
- 序列化到大于需要的数组,然后忘记注意实际写入了多少数据。调用
时,还必须调用SerializeToArray()
查看消息的大小,并且必须确保接收端接收到该大小并将其传递给ByteSize()
。否则,解析器将认为缓冲区末尾的额外字节是消息的一部分,并且将无法解析它们ParseFromArray()