.Net使用Confluent.Kafka.SchemaRegistry时ValueSerializer报序列化错误
错误原因
- 核心问题是Schema类型与序列化器不匹配:你参考JSON序列化示例编写的代码,使用的是Confluent.Kafka的JSON序列化器,该序列化器对接Schema Registry时要求注册的是标准JSON Schema,结构以类型声明开头、用
type: object标记对象类型、通过properties节点定义字段。但你手动注册的是Avro格式Schema,type: record、通过fields数组定义字段是Avro Schema的专属结构,两种Schema格式规则完全不同,序列化校验阶段直接失败。 - 注册操作遗漏关键参数:你通过curl提交Schema时没有显式指定
schemaType字段,Schema Registry默认会将传入的Schema识别为Avro类型,和代码中JSON序列化器预期的Schema类型不一致,即便字段名、字段类型完全对应,格式校验也无法通过。
修复方案
根据你实际使用的序列化协议二选一即可:
- 若计划使用Avro序列化
- 移除代码中JSON序列化相关逻辑,引入
Confluent.SchemaRegistry.Serdes.Avro依赖包,生产端使用AvroSerializer<T>作为值序列化器 - 定义与已注册Avro Schema结构匹配的C#实体类:类名为Person、命名空间对应com.xxx,依次定义string类型的firstName、lastName属性,long类型的age属性即可
- 移除代码中JSON序列化相关逻辑,引入
- 若计划使用JSON Schema序列化
- 先清理之前错误注册的Avro Schema,替换为符合规范的JSON Schema,注册请求体参考如下:
'{ "schema": "{\"type\":\"object\",\"title\":\"Person\",\"namespace\":\"com.xxx\",\"properties\":{\"firstName\":{\"type\":\"string\"},\"lastName\":{\"type\":\"string\"},\"age\":{\"type\":\"integer\"}},\"required\":[\"firstName\",\"lastName\",\"age\"]}", "schemaType": "JSON" }'
- 重新执行curl注册命令时,必须携带
schemaType: "JSON"参数,避免Schema Registry误识别Schema类型 - 确认项目引入
Confluent.SchemaRegistry.Serdes.Json依赖,C#实体类字段、类型与JSON Schema定义保持一致即可
内容的提问来源于stack exchange,提问作者Padmaraj
相关产品推荐
相关产品推荐

