当ParseFromArray在协议缓冲区中返回true时

时间:2013-11-08 07:52:48

标签: protocol-buffers

I ParseFromArray协议缓冲区的协议,协议不缺任何文件。但是ParseFromArray函数返回false。为什么呢?

1 个答案:

答案 0 :(得分:7)

我假设您正在使用C ++。如果出现ParseFromArray()则失败:

  • 输入数据不是有效的protobuf格式。
  • 输入数据缺少必填字段。

如果您确定已设置所有必填字段,则必须是输入数据已损坏的情况。您应该验证传入ParseFromArray()的字节和大小正好您在发送方SerializeToArray()ByteSize()获得的字节和大小。您可能会发现某处丢失了某些字节,或者某些字节已损坏。

腐败的常见原因包括:

  • 在纯文本通道上传递编码字节。例如。如果您将数据写入(或从中读取)未以“二进制”模式打开的文件,或者您在某些时候将字节存储在Java String中,则数据将被破坏,因为这些渠道期望文本,编码的protobufs不是文本。
  • 将字节作为char*传递,即假设NUL终止。编码的protobufs可以包含'\0'个字节,这意味着您不能单独表示一个char* - 您必须分别包含该大小。
  • 序列化为大于所需数组的数组,然后忘记关注实际写入的数据量。当您致电SerializeToArray()时,您还必须致电ByteSize()以查看邮件的大小,并且您必须确保接收端收到该尺寸并将其传递给ParseFromArray()。否则,解析器会认为缓冲区末尾的额外字节是消息的一部分,并且无法解析它们。