GenericRecord to SpecificRecord object using Avro



我使用Confluent.Kafka.Avro在 Apache Kafka 的生产者和消费者之间进行序列化。从生产者那里,我使用特定的记录,但在消费者方面,我希望将所有记录作为通用记录使用,然后将它们转换为特定记录。有没有办法自动执行此操作?还是需要实现所有这些转换?

如果你有特定的记录,并且你知道你可以转换为它,你应该使用 Kafka 的SpecificRecord反序列化程序。我相信在您的 Kafka 消费者中转换为GenericRecord的唯一情况是当您知道 Avro 内容无法使用当前特定数据类进行反序列化时,因为您没有该数据的任何特定数据类(模式/消息事先不知道(,或者模式以不兼容的方式更改, 因此,数据无法反序列化为当前的SpecificRecord类。这两种情况都不适用于您,因为您明确表示您拥有必要的SpecificRecord类。

话虽如此,根据我 https://stackoverflow.com/a/59442020/430128 在这里的回答,您可以使用deepCopy将 AvroGenericRecord转换为SpecificRecord

SpecificData.get().deepCopy(genericRecord.schema, genericRecord)

但是,您需要自己实现它,该解决方案与 Kafka 并不真正相关,因为一旦您使用和反序列化数据,您就可以尽可能地操作该信息。

但是,在特定的 Avro 反序列化程序中,它不接受 GenericRecord 类型,因为泛型不实现ISpecificRecord或者是SpecificFixed的子类

else
{
throw new ArgumentException(
$"{nameof(AvroDeserializer<T>)} " +
"only accepts type parameters of int, bool, double, string, float, " +
"long, byte[], instances of ISpecificRecord and subclasses of SpecificFixed."
);
}

https://github.com/confluentinc/confluent-kafka-dotnet/blob/master/src/Confluent.Kafka.Avro/SpecificDeserializerImpl.cs

如果你无论如何都要转换为SpecificRecord,那么你应该只使用SpecificRecord反序列化程序

最新更新