使用Avro

时间:2018-08-23 09:31:26

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

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

2 个答案:

答案 0 :(得分:1)

您需要自己实现它,但是,该解决方案与Kafka并没有真正的关系,因为一旦使用并反序列化数据,便可以对其进行操作。

但是,在特定Avro解串器中,由于Generics don't implement ISpecificRecord or are subclasses of SpecificFixed

,它将不接受GenericRecord类型。
        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反序列化器

答案 1 :(得分:0)

如果您有特定记录,并且知道可以转换为该记录,则应使用Kafka的SpecificRecord反序列化器。我认为,只有在您知道使用当前特定的数据类无法对Avro内容进行反序列化的情况下,在Kafka使用者中转换为GenericRecord的唯一情况是,因为您没有任何特定的数据类可用于该数据(该模式/消息事先未知),或者该模式以不兼容的方式进行了更改,因此无法将该数据反序列化为当前的SpecificRecord类。当您明确地说您拥有必要的SpecificRecord类时,以上两种情况均不适用于您。

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

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