.NET Core3.1集成Confluent Kafka报Avro数组未实现非泛型IList错误如何解决
问题原因
- 你使用的1.7.0版本Schema Registry、1.3.0版本Serdes对应的底层Avro序列化组件,对数组类型属性有强制校验要求:属性必须实现非泛型IList接口。你生成的类中orderLineIds属性是
IList<System.Int32>泛型接口类型,序列化器无法识别接口类型,也无法校验非泛型IList的实现情况,因此抛出异常。 - 如果你给该属性赋值的是
int[]数组类型,数组虽然实现了泛型IList,但旧版Avro序列化器对数组类型的兼容存在缺陷,同样会触发这个报错。
解决方案
- 修改自动生成类的属性类型
将orderLineIds的属性类型从IList<System.Int32>调整为具体的List<System.Int32>类型,List同时实现了泛型和非泛型IList,完全符合旧版序列化器的校验要求:
public List<System.Int32> orderLineIds { get { return this._orderLineIds; } set { this._orderLineIds = value; } } // 对应的私有字段 _orderLineIds 也要同步修改为List<System.Int32>类型
- 赋值时统一使用List类型
不要给该字段直接赋值数组类型,所有赋值场景都使用new List<int>(),或者把数组通过ToList()转换后再赋值,避免序列化器识别到数组类型触发兼容问题。 - 可选:升级组件版本
如果你的项目允许升级依赖,可以将Schema Registry和Serdes类库升级到2.0.0及以上版本,该版本已经修复了泛型IList和数组类型的序列化兼容问题,无需修改属性类型即可正常序列化。
内容的提问来源于stack exchange,提问作者Ismail
相关产品推荐
相关产品推荐

