我使用Confluent.Kafka.Avro
在Apache Kafka的生产者和消费者之间进行序列化。在生产者中,我使用特定的记录,但是在消费者方面,我想将所有记录作为通用记录使用,然后将它们转换为特定记录。有什么办法可以自动执行此操作?还是需要执行所有这些转换?
答案 0 :(得分:1)
您需要自己实现它,但是,该解决方案与Kafka并没有真正的关系,因为一旦使用并反序列化数据,便可以对其进行操作。
但是,在特定Avro解串器中,由于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."
);
}
如果您仍然要转换为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)