Protocol buffers Protobuf反序列化异常

Protocol buffers Protobuf反序列化异常,protocol-buffers,protobuf-java,Protocol Buffers,Protobuf Java,尝试在Java中使用protobuf反序列化消息并获取以下异常 由:CO.GoGoL.TyfBuff.ValuePrimuloBuffelExtExc:在解析协议消息时,输入在字段的中间意外终止。这可能意味着输入被截断,或者嵌入的消息误报了自己的长度。 位于com.google.protobuf.InvalidProtocolBufferException.truncatedMessage(InvalidProtocolBufferException.java:86) com.google.pr

尝试在Java中使用protobuf反序列化消息并获取以下异常

由:CO.GoGoL.TyfBuff.ValuePrimuloBuffelExtExc:在解析协议消息时,输入在字段的中间意外终止。这可能意味着输入被截断,或者嵌入的消息误报了自己的长度。 位于com.google.protobuf.InvalidProtocolBufferException.truncatedMessage(InvalidProtocolBufferException.java:86) com.google.protobuf.CodedInputStream$arraydeconder.readRawLittleEndian64(CodedInputStream.java:1179) 位于com.google.protobuf.CodedInputStream$arraydeconder.readFixed64(CodedInputStream.java:791) 位于com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:534)


在com.google.protobuf.GeneratedMessageV3.parseUnknownFieldProto3(GeneratedMessageV3.java:305)

我已经手动解码了您的字符串,我同意库的说法:您的消息被截断了。我猜这是因为您使用的是基于字符串的API,并且数据中有一个零字节-许多文本API看到一个零字节(
num
,在ASCII术语中)表示字符串的结尾

以下是分类:

\n=10=field 1, length prefix - I'm assuming this is a string
\x14=20
"id:article:v1:964000"
(22 bytes used for field 1)

\x12=18=field 2, length prefix - I'm assuming this is a sub-messssage
$=36
  \n=10=field 1, length prefix - I'm assuming this is a string
  \x10=16
  "predicted_topics"
  (18 bytes used for field 2.1)

  \x12=18=field 2, length prefix - I'm assuming this is a string
  \x06=6
  "IS/biz"
  (8 bytes used for field 2.2)

  \x1a=26=field 3, length prefix - I'm assuming this is "bytes"
  \x08=8
    \xf0
    l
    \x8f
    \xde
    p
    \x9f
    \xe4

    (unexpected EOF)
最后,我们试图解码最内部消息的8个字节,只剩下7个字节。我知道这不是一个子消息,因为这会导致一个无效的标记,而且它看起来不像UTF-8,所以我假设这是一个
bytes
字段(但坦率地说,这并不重要:我们需要8个字节,我们只有7个字节)

我猜
字节
字段中的最后一个字节是零;如果我们假设结尾缺少一个
\x00
,那么字段2.3是10个字节,我们考虑了18+8+10=36个字节,这将使子消息(字段2)完整。在外部子消息之后,很可能会有更多丢失的数据-我无法知道


因此:请确保您没有对二进制数据使用基于文本的API。

好吧。。。是这样吗?您可以使用诸如检查protobuf有效负载之类的工具。当人们使用过大的数组作为缓冲区,忘记从末尾修剪未写入的零时,我经常看到这种情况。这是消息的字节字符串\n\x14id:article:v1:964000\x12$\n\x10\u topics\x12\x06IS/biz\x1a\x08\xf0l\x8f\xdep\x9f\xe4?有十六进制还是base-64格式?如果你能发布十六进制或base-64,我会很高兴我们讨论的是相同的字节,我不太确定。我使用Python的SerializeToString来序列化类。我完全不知道API是做什么的。谢谢你指出这一点。我将从这里开始调试。