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();
}
}
});