我在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被正确解析,没有任何异常。
为什么第二种方法行得通,而第一种方法不行?
1条答案
按热度按时间a0x5cqrl1#
您使用的是字符串反序列化程序,它需要某些特殊字符来定义消息的限制。它试图反序列化一个字符串,但他只收到一堆字节的格式,消费者根本不期望。
你有一个用
ByteArraySerializer
,因此您的使用者必须使用ByteArrayDeserializer
.试着用一个
org.apache.kafka.common.serialization.StringSerializer
如果你真的想自动反序列化为字符串格式。