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