当前位置: 首页 > 知识库问答 >
问题:

Protobuf反序列化异常

壤驷彦
2023-03-14

试图在Java中使用protobuf反序列化消息,并得到以下异常。

原因:com.google.protobuf.InvalidProtocolBufferException:在解析协议消息时,输入意外地在字段中间结束。这可能意味着输入被截断,或者嵌入的消息错误报告了自己的长度。在com.google.protobuf.InvalidProtocolBufferException.TruncatedMessage(InvalidProtocolBufferException.Java:86)在com.google.protobuf.CodedInputStream$ArrayDecoder.ReadRawlittleEndian64(CodedInputStream.Java:1179)在com.google.protobuf.CodedInputStream$ArrayDecoder.ReadFixed64(CodedInputStream.Java:791)在com.google.protobuf.UnknownFieldSet

共有1个答案

广宏远
2023-03-14

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

具体情况如下:

\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个)。

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

所以:确保您没有使用二进制数据的基于文本的API。

 类似资料:
  • 我需要通过flink消费Kafka,不幸的是,Kafka消息是在serde中使用原型,完全不知道如何处理它,这里是来自互联网的代码,但我不能使它工作。 这不起作用,它会让NPE: 有人知道我做错了什么吗?使用twitter ProtobufSerializer是唯一值得拥有protobuf的方法吗?还是还有别的路要走?

  • 我试图阅读和打印从Kafka使用Apache Flink的原型消息。 我遵循官方文件,但没有成功:https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/fault-tolerance/serialization/third_party_serializers/ Flink消费者代码是: 反序列化器代码是:

  • 问题内容: 我正在尝试使用protobuf序列化结构。经过许多小时试图弄清楚我在做什么错,我决定测试google的示例,但效果不佳 我从Google(https://developers.google.com/protocol- buffers/docs/javatutorial )获得以下协议: 我正在尝试将其序列化: byte []序列化= john.toByteArray(); 我得到“ j

  • 问题内容: 我需要执行RestRequest并获取一些JSON,因此我不确定我的方法是否真正异步,因为使用此方法时,UI仍然有些冻结。 特别针对以下代码行: 真的不同步吗?因为它似乎阻塞了UI。您能告诉我如何使此函数正确异步吗? 问题答案: 似乎作为参数传递给的委托正在UI线程上执行。如果是这种情况,只需使用即可在线程池上运行委托。 是田野吗?在我看来,它应该是局部变量。另外,在反序列化json之

  • 我使用协议缓冲区在c和c#客户机-服务器应用程序之间发送和接收数据。我用protobuf网来解决这个问题。我有两个原始文件,一个请求命令和一个响应命令。我能够将命令从c#客户端发送到c服务器并进行反序列化。但我不能用c#反序列化。 我在缓冲区中以字节为单位获取数据,但它不会在响应命令中反序列化。

  • 我在使用Jackson1.9.13(和Jackson2.5.0)进行序列化/反序列化时遇到了一个问题,现在已经解决了几天了,没有任何成功。 我的目标是使用@jsonanygetter&@jsonanysetter,我想动态地计算对象是否应该写入输出。我有一个用ObjectMapper序列化的JSON定义(并检查是否应该包含对象),然后将对象转换回字符串。 为此,我使用了一个“HidableSeri