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