4

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

4

1 回答 1

11

我假设您使用的是 C++。 ParseFromArray()如果出现以下情况则失败:

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

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

腐败的常见原因包括:

  • 通过纯文本通道传递编码字节。例如,如果您将数据写入(或从中读取)未以“二进制”模式打开的文件,或者如果您在某些时候将字节存储在 JavaString中,则数据将损坏,因为这些通道需要文本,并且编码的 protobuf 不是文本。
  • 将字节作为 a 传递char*,即假设 NUL 终止。编码的 protobuf 可以包含'\0'字节,这意味着您不能将一个char*单独表示为一个 - 您必须单独包含大小。
  • 序列化到比需要大的数组,然后忘记注意实际写入了多少数据。当您调用时SerializeToArray(),您还必须调用ByteSize()以查看消息的大小,并且您必须确保接收端接收到该大小并将其传递给ParseFromArray()。否则,解析器将认为缓冲区末尾的额外字节是消息的一部分,并且将无法解析它们。
于 2013-11-08T22:20:17.320 回答