java通过字符串反序列化解析kafka protobuf事件

vsaztqbk  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(879)

我在kafka上接收protobuf消息,消费者被配置为使用

value.deserializer = org.apache.kafka.common.serialization.StringDeserializer

如果我使用 parseFrom(byte[] data) 方法 com.google.protobuf.Parser 通过传递反序列化事件字符串的字节数组,该方法引发以下异常:

com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either than the input has been truncated or that an embedded message misreported its own length.

如果我反序列化Kafka事件

value.deserializer = org.apache.kafka.common.serialization.ByteArrayDeserializer

并将接收到的字节数组直接传递给 parseFrom ,protobuf被正确解析,没有任何异常。
为什么第二种方法行得通,而第一种方法不行?

a0x5cqrl

a0x5cqrl1#

您使用的是字符串反序列化程序,它需要某些特殊字符来定义消息的限制。它试图反序列化一个字符串,但他只收到一堆字节的格式,消费者根本不期望。
你有一个用 ByteArraySerializer ,因此您的使用者必须使用 ByteArrayDeserializer .
试着用一个 org.apache.kafka.common.serialization.StringSerializer 如果你真的想自动反序列化为字符串格式。

相关问题