Kafka 生产者错误:“未指定值序列化器,并且没有为类型定义默认序列化器...”

Mig*_*Slv 7 c# apache-kafka kafka-producer-api confluent-kafka-dotnet

我刚刚开始使用 Kafka 并遇到以下菜鸟错误:

'Value cannot be null.
Parameter name: Value serializer not specified and there is no default serializer defined for type ActMessage.'
Run Code Online (Sandbox Code Playgroud)

当尝试发送类对象、ActMessage 对象而不是示例附带的简单字符串时,会发生这种情况。引发错误的代码行是:

using (var p = new ProducerBuilder<Null, ActMessage>(config ).Build()
Run Code Online (Sandbox Code Playgroud)

我正在使用.net 客户端。

我的理解是,我需要在第一个类型参数中使用默认序列化之一,这是 Kafka 客户端附带的一个,如此处所述但无法在此 .net 包中找到它们。我想我可以建造一个,但这会浪费时间。

这是一个可重现的示例:

public class ActMessage  {
    public int SomeId {get;set;}
    public string SomeContent {get;set;}
}

class Tester  {

void send(){

    var config = new ProducerConfig { BootstrapServers = "localhost:9092" };

        using (var p = new ProducerBuilder<Null, ActMessage>(config).Build()) //throws error here
        {
            var dr = p.ProduceAsync("news", new Message<Null, ActMessage>
            {
                Value = new ActMessage { SomeId = 1, SomeContent="hi" },
            }
                ).Result;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

cri*_*007 7

我建议检查examples/该存储库中的工作目录,以查看可以复制到自己的项目中的工作代码。


如果您有自己的类,则需要实现ISerializerIDeserializer接口。

或者您可以使用内置的


然而,另一种选择是使用 Avro

这需要编写一个Avro 架构文件,然后用于avrogen创建您的类,而不是手动编写它。例如

dotnet tool install --global Apache.Avro.Tools

avrogen -s User.avsc .
Run Code Online (Sandbox Code Playgroud)

那么你必须始终在 Kafka 客户端中添加一些ValueSerializer才能发送数据