1

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

此时,是否有可能以某种方式将结果对象转换为 avro-tools 为 v2 生成的代码中的相应字段和对象?

到目前为止,看起来处理消息的唯一方法会导致“GenericRecord”,它需要字符串键来访问字段的值。我更喜欢为 v2 使用生成的代码,并将任何拼写错误变成编译错误而不是运行时错误,在编码时知道值的数据类型,并避免设置一堆枚举来包含字符串键。

4

1 回答 1

0

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
}

我的错误是缺少Ton new SpecificDatumReader<T>,所以它返回 aGenericRecord而不是T.

于 2021-04-20T16:18:04.497 回答