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

lx0bsm1f  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(344)

假设我使用avro工具为“myschema”的v2生成代码,一条消息出现在用“myschema”的v1编写的队列中。如果我理解正确的话,处理这种情况的最佳方法就是认识到消息是用“myschema”的v1编写的,使用schema注册表获取v1模式,并使用v1反序列化消息。
在这一点上,是否有可能以某种方式将结果对象转换为avro工具为v2生成的代码中相应的字段和对象?
到目前为止,处理消息的唯一方法似乎是生成一个“genericord”,它需要字符串键来访问字段的值。我更喜欢使用生成的v2代码,将任何输入错误转换为编译错误而不是运行时错误,在编码时知道值的数据类型,避免设置一堆枚举来包含字符串键。

zi8p0yeb

zi8p0yeb1#

avro用户邮件列表上的scott已回复(https://lists.apache.org/thread.html/r2e77597fd20de1379fdd4287c02fc703a631cd2309f74f33d6a457b8%40%3cuser.avro.apache.org%3e):
下面的代码返回类型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
}

我的错误是错过了比赛 Tnew SpecificDatumReader<T> ,所以它返回了一个 GenericRecord 而不是 T .

相关问题