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

标签 java apache-kafka protocol-buffers

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

反序列化事件
value.deserializer = org.apache.kafka.common.serialization.StringDeserializer

如果我通过传递反序列化事件字符串的字节数组来使用 com.google.protobuf.ParserparseFrom(byte[] data) 方法,该方法会抛出以下内容异常:

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被正确解析,没有任何异常。

为什么第二种方式可以,而第一种方式不行?

最佳答案

您正在使用字符串反序列化器,它需要某些特殊字符来定义消息的限制。它试图反序列化一个字符串,但他只收到一堆字节,其格式是消费者根本不期望的。

您有一个使用 ByteArraySerializer 进行序列化的生产者,因此您的消费者必须使用 ByteArrayDeserializer 对其进行反序列化。

如果您真的想以字符串格式自动反序列化,请尝试使用 org.apache.kafka.common.serialization.StringSerializer 进行生成。

关于java - 通过字符串反序列化解析kafka protobuf事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48205436/

相关文章:

Java高效存储大量排序数据

java - 带条件的 PostgreSQL 触发器

elasticsearch - Logstash 和卡夫卡

c++ - 关于google protobuf动态链接错误

java - 动画Drawable + Android + 启动和停止动画

hadoop - 防止加缪增加偏移值

c# - Consumer 中 Confluence.Kafka 中的事务

c++ - 是否可以从描述符构造一个空消息?

python - 将二进制文件转换为 proto 文件

java - Swing 组件 setSize()/setBounds() 问题