【问题标题】:GenericRecord to SpecificRecord object using Avro使用 Avro 的 GenericRecord 到 SpecificRecord 对象
【发布时间】:2018-08-23 09:31:26
【问题描述】:

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

【问题讨论】:

  • 我不认为你可以将一个类转换为更具体的类型,一般来说。就像如果你有一个 Animal 类,你不能让它成为 DogCat 只是给定一个 Animal 的实例
  • @cricket_007 Kafka.Avro 中的 GenericRecord 有关于序列化类型的信息。我只想知道Kafka.Avro是否已经有这个实现或者需要自己实现这个。
  • 我是说 Avro 中的 GenericRecord 不能转换为 SpecificRecord,尽管是的,通用记录可能包含架构属性

标签: c# .net-core avro confluent-platform


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    但是,在特定的 Avro 反序列化器中,它不会接受 GenericRecord 类型,因为Generics don't implement ISpecificRecord or are subclasses of 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 Deserializer

    【讨论】:

      猜你喜欢
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多