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

use*_*794 1 protocol-buffers

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

Ken*_*rda 7

我假设你正在使用C++. ParseFromArray()失败如果:

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

如果您确定已设置所有必填字段,则必须是输入数据已损坏的情况.您应确认要传递到字节和大小ParseFromArray()完全相同,你从了字节和大小SerializeToArray(),并ByteSize()在发送端.您可能会发现某处丢失了某些字节,或者某些字节已损坏.

腐败的常见原因包括:

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

  • 输入数据缺少必填字段时,会发生一种特殊情况,即**使用不正确的值解析必填枚举字段**。根据[doc](https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#enum),如果在解析消息时读取了无效的枚举值,它将被视为未知领域。反过来,如果发送者的原始文件中具有不同版本的枚举定义,则可以通过电线传递无效的枚举值,例如,与接收者相比,发送者的枚举具有多个其他值。 (2认同)