Java KafkaProtobufSerializer序列化值意外字节的来源及跨语言兼容问题
Kafka Protobuf跨语言序列化兼容性问题(Java vs Node.js)
背景
- Node.js应用使用
@kafkajs/confluent-schema-registry库序列化Protobuf对象 - Java应用使用官方
KafkaProtobufSerializer序列化同Schema的对象 - 主题已绑定对应Protobuf Schema,但二者序列化结果不一致:KafkaUI无法用SchemaRegistry Value Serde解析Node.js输出,Java消费者也无法消费Node.js生产的数据
Confluent Protobuf序列化规范
第1字节:魔数(固定为0)
第2-5字节:Schema注册表ID(4字节大端序)
第6字节及之后:Protobuf编码的对象内容
实际序列化结果对比
示例1(注册表ID=5)
- 原始Protobuf对象编码字节:
08 4d 12 04 70 65 74 65 - Java序列化完整字节:
00 00 00 00 05 00 08 4d 12 04 70 65 74 65(注册表ID后多1个00字节) - Node.js序列化完整字节:
00 00 00 00 05 08 4d 12 04 70 65 74 65(无额外字节,符合规范)
示例2(注册表ID=4)
- Java序列化完整字节:
00 00 00 00 04 02 04 0a 26...(注册表ID后多02 04两个字节) - Node.js序列化完整字节:
00 00 00 00 04 0a 26...(无额外字节)
验证结果
使用protoscope工具测试:
- Java序列化结果从第6字节开始的内容无法解析
- 仅从第8字节(跳过额外字节)开始才能正常解析,说明额外字节不属于Protobuf对象本身的编码内容
疑问
- Java端的额外字节是怎么生成的?来源是什么?
- 同Schema、同属性值的对象,为何跨语言序列化结果不一致?
- Java应用为何依赖这些额外字节?
内容的提问来源于stack exchange,提问作者user177933
相关产品推荐
相关产品推荐

