假设我使用avro-tools为"mySchema“的v2生成代码,一条消息出现在使用"mySchema”的v1编写的队列中。如果我理解正确的话,处理这种情况的最佳方法是认识到消息是用"mySchema“的v1编写的,使用模式注册表获取v1模式,并使用v1反序列化消息。
在这一点上,有没有可能以某种方式将生成的对象转换为来自avro-tools为v2生成的代码的相应字段和对象?
到目前为止,它看起来是处理"GenericRecord“中消息结果的唯一方法,它需要字符串键来访问字段的值。我更喜欢使用为v2生成的代码,并将任何输入错误转换为编译错误而不是运行时错误,在编码时了解值的数据类型,并避免设置一堆枚举来包含字符串键。
发布于 2021-04-21 00:18:04
Avro用户邮件列表中的斯科特回答(https://lists.apache.org/thread.html/r2e77597fd20de1379fdd4287c02fc703a631cd2309f74f33d6a457b8%40%3Cuser.avro.apache.org%3E):
下面的代码返回类型T并使用SpecificDatumReader。
最终记录解码器= DecoderFactory.get().binaryDecoder(...);最终记录记录=新记录(v2Schema,v1Schema);尝试{最终T记录=datumReader.read(空,解码器);返回记录;}捕获(java.io.IOException ioe) { //处理它}
我的错误是缺少new SpecificDatumReader<T>上的T,所以它返回的是GenericRecord而不是T的实例。
https://stackoverflow.com/questions/67170438
复制相似问题