Java 如何将使用旧版本模式反序列化的Avro消息转换为新的编译模式?

Java 如何将使用旧版本模式反序列化的Avro消息转换为新的编译模式?,java,avro,avro-tools,Java,Avro,Avro Tools,假设我使用avro工具为“mySchema”的v2生成代码,一条消息出现在用“mySchema”的v1编写的队列中。如果我理解正确,处理这种情况的最佳方法是认识到消息是用“mySchema”的v1编写的,使用模式注册表获取v1模式,并使用v1反序列化消息 在这一点上,是否有可能以某种方式将生成的对象从avro工具为v2生成的代码转换为相应的字段和对象 到目前为止,处理消息结果的唯一方法似乎是“GenericRecord”,它需要字符串键来访问字段的值。我更喜欢使用生成的v2代码,将任何输入错误转

假设我使用avro工具为“mySchema”的v2生成代码,一条消息出现在用“mySchema”的v1编写的队列中。如果我理解正确,处理这种情况的最佳方法是认识到消息是用“mySchema”的v1编写的,使用模式注册表获取v1模式,并使用v1反序列化消息

在这一点上,是否有可能以某种方式将生成的对象从avro工具为v2生成的代码转换为相应的字段和对象


到目前为止,处理消息结果的唯一方法似乎是“GenericRecord”,它需要字符串键来访问字段的值。我更喜欢使用生成的v2代码,将任何输入错误转化为编译错误,而不是运行时错误,在编码时知道值的数据类型,避免设置一组枚举来包含字符串键。

Avro用户邮件列表()上的Scott:

下面的代码返回类型T并使用SpecificDatumReader

final BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(...);
final DatumReader<T> datumReader = new SpecificDatumReader<T>(v2Schema, v1Schema);
try {
    final T record = datumReader.read(null, decoder);
    return record;
} catch (java.io.IOException ioe) {
   // Handle it
}
final binarydecator decoder=DecoderFactory.get().binarydecator(…);
最终DatumReader DatumReader=新的SpecificDatumReader(v2Schema,v1Schema);
试一试{
最终T记录=datumReader.read(空,解码器);
返回记录;
}捕获(java.io.IOException-ioe){
//处理它
}
我的错误是在
new SpecificDatumReader
上缺少
T
,因此它返回的是
GenericRecord
而不是
T
的实例