C# 如何使用C语言反序列化卡夫卡中的Avro消息#

C# 如何使用C语言反序列化卡夫卡中的Avro消息#,c#,apache-kafka,avro,confluent-schema-registry,confluent-platform,C#,Apache Kafka,Avro,Confluent Schema Registry,Confluent Platform,嗨,我在合流卡夫卡工作。我有一个返回一般记录的消费者。我想反序列化它。我没有办法。我可以手动完成每个字段,如 object options = ((GenericRecord)response.Message.Value["Product"])["Options"]; 我在这里找到了一个 但如何将模式转换为流呢? 我想知道我们是否可以使用任何解决方案反序列化到我们的c#模型中?任何帮助都将不胜感激。谢谢 假设您正在使用客户端,您可以使用: (异步)Avro反序列化程序。将此反序列化器与ge

嗨,我在合流卡夫卡工作。我有一个返回一般记录的消费者。我想反序列化它。我没有办法。我可以手动完成每个字段,如

 object options = ((GenericRecord)response.Message.Value["Product"])["Options"];
我在这里找到了一个

但如何将模式转换为流呢? 我想知道我们是否可以使用任何解决方案反序列化到我们的c#模型中?任何帮助都将不胜感激。谢谢


假设您正在使用客户端,您可以使用:

(异步)Avro反序列化程序。将此反序列化器与
genericord
一起使用, 使用
avrogen.exe
工具或以下工具之一生成的类型 基本类型:
int
long
float
double
boolean
string
字节[]

:

var consumertask=Task.Run(()=>{
使用(var schemaRegistry=new CachedSchemaRegistryClient(new SchemaRegistryConfig{
SchemaRegistryUrl=SchemaRegistryUrl
}))
使用(var consumer=new ConsumerBuilder(new ConsumerConfig{
bootstrapserver=bootstrapserver,
GroupId=groupName
}).SetKeyDeserializer(新的AvroDeserializer(SchemareRegistry).AsSyncOverAsync()).SetValueDeserializer(新的AvroDeserializer(SchemareRegistry).AsSyncOverAsync()).SetErrorHandler((\uE)=>Console.WriteLine($“错误:{e.Reason}”).Build()){
消费者。订阅(主题名称);
试一试{
while(true){
试一试{
var consumerresult=consumer.consumer(cts.Token);
Console.WriteLine($”键:{consumerresult.Message.Key}\n值:{consumerresult.Value}”);
}
捕获(消费异常){
WriteLine($“消费错误:{e.error.Reason}”);
}
}
}
捕获(操作取消异常){
//提交最终偏移量并离开组。
consumer.Close();
}
}
});

假设您正在使用客户端,您可以使用:

(异步)Avro反序列化程序。将此反序列化器与
genericord
一起使用, 使用
avrogen.exe
工具或以下工具之一生成的类型 基本类型:
int
long
float
double
boolean
string
字节[]

:

var consumertask=Task.Run(()=>{
使用(var schemaRegistry=new CachedSchemaRegistryClient(new SchemaRegistryConfig{
SchemaRegistryUrl=SchemaRegistryUrl
}))
使用(var consumer=new ConsumerBuilder(new ConsumerConfig{
bootstrapserver=bootstrapserver,
GroupId=groupName
}).SetKeyDeserializer(新的AvroDeserializer(SchemareRegistry).AsSyncOverAsync()).SetValueDeserializer(新的AvroDeserializer(SchemareRegistry).AsSyncOverAsync()).SetErrorHandler((\uE)=>Console.WriteLine($“错误:{e.Reason}”).Build()){
消费者。订阅(主题名称);
试一试{
while(true){
试一试{
var consumerresult=consumer.consumer(cts.Token);
Console.WriteLine($”键:{consumerresult.Message.Key}\n值:{consumerresult.Value}”);
}
捕获(消费异常){
WriteLine($“消费错误:{e.error.Reason}”);
}
}
}
捕获(操作取消异常){
//提交最终偏移量并离开组。
consumer.Close();
}
}
});

谢谢。但我的模式包含数据。消费者正在回归。如何将模式转换为流?谢谢。但我的模式包含数据。消费者正在回归。如何将模式转换为流?谢谢。假设我必须使用反序列化异步(ReadOnlyMemory、Boolean、SerializationContext)。那么,我应该向参数ReadOnlyMemory和SerializationContextHi Giorgos发送什么呢。你能告诉我应该传递什么到反序列化异步方法吗?你可以使用
新的ReadOnlyMemory(data.ToArray())
这样数据将是ConsumerResult类型吗?我从消费者返回的数据是ConsumerResult类型,那么我现在可以传递什么?谢谢。假设我必须使用反序列化异步(ReadOnlyMemory、Boolean、SerializationContext)。那么,我应该向参数ReadOnlyMemory和SerializationContextHi Giorgos发送什么呢。你能告诉我应该传递什么到反序列化异步方法吗?你可以使用
新的ReadOnlyMemory(data.ToArray())
这样数据将是ConsumerResult类型的?我从使用者返回的数据是ConsumerResult类型的,那么我现在可以传递什么?
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();
    }
  }
});