C# 使用Avro将GenericRecord记录到SpecificRecord对象
我使用C# 使用Avro将GenericRecord记录到SpecificRecord对象,c#,.net-core,avro,confluent-platform,C#,.net Core,Avro,Confluent Platform,我使用Confluent.Kafka.Avro在ApacheKafka的生产者和消费者之间进行序列化。从producer我使用特定的记录,但在consumer方面,我希望将所有记录作为通用记录使用,然后将它们转换为特定记录。有没有什么方法可以自动做到这一点?或者需要实现所有这些转换?您需要自己实现,但是,该解决方案实际上与卡夫卡无关,因为一旦您消费并反序列化数据,您就可以随心所欲地操作该信息 但是,在特定的Avro反序列化程序中,它不会接受GenericRecord类型,因为 else { 抛出
Confluent.Kafka.Avro
在ApacheKafka的生产者和消费者之间进行序列化。从producer我使用特定的记录,但在consumer方面,我希望将所有记录作为通用记录使用,然后将它们转换为特定记录。有没有什么方法可以自动做到这一点?或者需要实现所有这些转换?您需要自己实现,但是,该解决方案实际上与卡夫卡无关,因为一旦您消费并反序列化数据,您就可以随心所欲地操作该信息
但是,在特定的Avro反序列化程序中,它不会接受GenericRecord类型,因为
else
{
抛出新的ArgumentException(
$“{nameof(AvroDeserializer)}”+
仅接受int、bool、double、string、float等类型参数+
长,字节[],IsSpecificRecord的实例和SpecificFixed的子类
);
}
如果您打算转换为SpecificRecord,那么您应该只使用SpecificRecord反序列化器,您需要自己实现它。不过,该解决方案实际上与Kafka无关,因为一旦您使用并反序列化数据,您就可以随心所欲地操作该信息 但是,在特定的Avro反序列化程序中,它不会接受GenericRecord类型,因为
else
{
抛出新的ArgumentException(
$“{nameof(AvroDeserializer)}”+
仅接受int、bool、double、string、float等类型参数+
长,字节[],IsSpecificRecord的实例和SpecificFixed的子类
);
}
如果您仍要转换为SpecificRecord,那么您应该只使用SpecificRecord反序列化程序如果您有特定的记录并且您知道您可以转换为该记录,那么您应该使用Kafka的
SpecificRecord
反序列化程序。我认为在Kafka消费者中转换为genericord
的唯一情况是,您知道无法使用当前特定的数据类反序列化Avro内容,因为您没有该数据的任何特定数据类(模式/消息事先不知道),或者模式已以不兼容的方式更改,因此无法将数据反序列化到当前的SpecificRecord
类中。这两种情况都不适用于您,因为您明确表示您拥有所需的specifirecord
类
也就是说,根据我在这里的回答,您可以使用deepCopy
将Avrogenericord
转换为specific record
:
SpecificData.get().deepCopy(genericRecord.schema, genericRecord)
如果您拥有特定记录,并且知道可以转换为该记录,则应使用Kafka的
SpecificRecord
反序列化程序。我认为在Kafka消费者中转换为genericord
的唯一情况是,您知道无法使用当前特定的数据类反序列化Avro内容,因为您没有该数据的任何特定数据类(模式/消息事先不知道),或者模式已以不兼容的方式更改,因此无法将数据反序列化到当前的SpecificRecord
类中。这两种情况都不适用于您,因为您明确表示您拥有所需的specifirecord
类
也就是说,根据我在这里的回答,您可以使用deepCopy
将Avrogenericord
转换为specific record
:
SpecificData.get().deepCopy(genericRecord.schema, genericRecord)
一般来说,我认为不能将类强制转换为更具体的类型。比如,如果你有一个
Animal
类,你不能让它成为Dog
或Cat
,只要给出一个Animal
@cricket\u 007 genericord在卡夫卡的实例。Avro有关于序列化类型的信息。我只是想知道Kafka.Avro是否已经有了这个实现,或者需要自己实现。我是说Avro中的genericord
不能转换成SpecificRecord
,即使是的,generic记录可能包含模式属性。我认为一般来说,您不能将类转换成更具体的类型。比如,如果你有一个Animal
类,你不能让它成为Dog
或Cat
,只要给出一个Animal
@cricket\u 007 genericord在卡夫卡的实例。Avro有关于序列化类型的信息。我只是想知道Kafka.Avro是否已经有了这个实现,或者需要自己实现。我是说Avro中的genericord
不能转换为SpecificRecord
,即使是的,generic记录可能包含模式属性