Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Avro将GenericRecord记录到SpecificRecord对象_C#_.net Core_Avro_Confluent Platform - Fatal编程技术网

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
将Avro
genericord
转换为
specific record

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

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

也就是说,根据我在这里的回答,您可以使用
deepCopy
将Avro
genericord
转换为
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记录可能包含模式属性