如何使用C#在Kafka中反序列化Avro消息

时间:2019-07-16 14:30:07

标签: c# apache-kafka avro confluent-schema-registry confluent-kafka

嗨,我正在工作Confluent kafka。我有返回通用记录的使用者。我想反序列化它。我没有找到任何办法。我可以手动完成每个字段,例如

 object options = ((GenericRecord)response.Message.Value["Product"])["Options"];

我在这里找到了一个

  

Deserialize an Avro file with C#   但是如何将架构转换为流?   我想知道是否可以使用任何解决方案将序列化到我们的C#模型中?任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

假设您正在使用confluent-dot-net客户端,则可以使用AvroDeserializer

  

(异步)Avro解串器。将此解串器与GenericRecord一起使用,   使用avrogen.exe工具或以下之一生成的类型   基本类型:intlongfloatdoublebooleanstringbyte[]

Example

    var consumeTask = Task.Run(() =>
    {
        using (var schemaRegistry = new CachedSchemaRegistryClient(new SchemaRegistryConfig { SchemaRegistryUrl = schemaRegistryUrl }))
        using (var consumer =
            new ConsumerBuilder<string, GenericRecord>(new ConsumerConfig { BootstrapServers = bootstrapServers, GroupId = groupName })
                .SetKeyDeserializer(new AvroDeserializer<string>(schemaRegistry).AsSyncOverAsync())
                .SetValueDeserializer(new AvroDeserializer<GenericRecord>(schemaRegistry).AsSyncOverAsync())
                .SetErrorHandler((_, e) => Console.WriteLine($"Error: {e.Reason}"))
                .Build())
        {
            consumer.Subscribe(topicName);

            try
            {
                while (true)
                {
                    try
                    {
                        var consumeResult = consumer.Consume(cts.Token);

                        Console.WriteLine($"Key: {consumeResult.Message.Key}\nValue: {consumeResult.Value}");
                    }
                    catch (ConsumeException e)
                    {
                        Console.WriteLine($"Consume error: {e.Error.Reason}");
                    }
                }
            }
            catch (OperationCanceledException)
            {
                // commit final offsets and leave the group.
                consumer.Close();
            }
        }
    });