Avro SpecificRecord(即生成的java类)是否与模式演变兼容?即如果我有Avro消息来源(在我的情况下,kafka)并且我想将这些消息反序列化为特定记录,是否可以安全地进行?
我所看到的:
在模式的末尾添加一个字段工作正常 - 可以反序列化ok到specificrecord
向中间添加字段不会 - 即打破现有客户端
即使消息兼容,这也是一个问题.
如果我可以找到新的模式(使用例如汇合模式注册表),我可以反序列化为GenericRecord,但似乎没有办法从genericrecord映射到不同模式的specificrecord.
MySpecificType message = (T SpecificData.get().deepCopy(MySpecificType.SCHEMA$, genericMessage);
在各个地方都提到了Deepcopy,但它使用了索引,所以不起作用..
当你有两个模式并且它们兼容时,有没有安全的方法在两个avro对象之间进行映射?即使我可以从genercrecord映射到genericrecord,这样我也可以使用deepcopy技巧来完成这项工作.
这里有针对特定数据类型转换的示例测试。所有这些都在“ specificDeserializerProps”配置中
https://github.com/confluentinc/schema-registry/blob/master/avro-serializer/src/test/java/io/confluent/kafka/serializers/KafkaAvroSerializerTest.java
我添加了以下配置,并根据需要获取了特定类型。
HashMapspecificDeserializerProps = new HashMap (); specificDeserializerProps.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "bogus"); specificDeserializerProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true"); specificAvroDeserializer = new KafkaAvroDeserializer(schemaRegistry, specificDeserializerProps);
希望能有所帮助