Protocol buffers Protobuf反序列化异常
尝试在Java中使用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
由: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是做什么的。谢谢你指出这一点。我将从这里开始调试。