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

Protocol buffers 当ParseFromArray在协议缓冲区中返回true时,protocol-buffers,Protocol Buffers,我解析了协议缓冲区的协议,协议不缺少任何字段。但是ParseFromArray函数返回false。为什么? 我假设你使用C++。代码>ParseFromArray()在以下情况下失败: 输入数据不是有效的protobuf格式 输入数据缺少必填字段 如果您确定设置了所有必填字段,则输入数据一定已损坏。您应该验证传递到ParseFromArray()的字节和大小是否与从发送端的SerializeToArray()和ByteSize()获得的字节和大小完全相同。您可能会发现您正在丢失某些字节,或者

我解析了协议缓冲区的协议,协议不缺少任何字段。但是ParseFromArray函数返回
false
。为什么?

我假设你使用C++。代码>ParseFromArray()在以下情况下失败:

  • 输入数据不是有效的protobuf格式
  • 输入数据缺少必填字段
如果您确定设置了所有必填字段,则输入数据一定已损坏。您应该验证传递到
ParseFromArray()
的字节和大小是否与从发送端的
SerializeToArray()
ByteSize()
获得的字节和大小完全相同。您可能会发现您正在丢失某些字节,或者某些字节已损坏

腐败的常见原因包括:

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

您可能需要添加语言标签(例如Java、c#等),因为不同语言的协议缓冲区版本不同。此外,有些语言有几种不同版本的协议缓冲区。当输入数据缺少必填字段时,在解析具有不正确值的必需枚举字段时会出现一种特殊情况。根据,如果在解析消息时读取了无效的枚举值,则该值将被视为未知字段。反过来,如果发送方的原始文件中有不同版本的枚举定义,则可以通过连接传递无效的枚举值,比如说,发送方的枚举与接收方相比有多个附加值。