【问题标题】:Kafka Producer Error: ' Value serializer not specified and there is no default serializer defined for type ...'Kafka Producer 错误:'未指定值序列化程序,并且没有为类型定义默认序列化程序......'
【发布时间】:2020-07-27 12:18:14
【问题描述】:

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

'Value cannot be null.
Parameter name: Value serializer not specified and there is no default serializer defined for type ActMessage.'

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

using (var p = new ProducerBuilder<Null, ActMessage>(config ).Build()

我正在使用.net client.

我的理解是,我需要在第一个类型参数中使用一个默认序列化,即 Kafka 客户端附带的一个,如 here 所述,但在此 .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;
        }
    }
}

【问题讨论】:

  • 好的。您没有像错误所说的那样在 ProducerConfig 中设置序列化程序。 Kafka 如何知道如何处理您的类以将其转换为字节?同样,你至少应该在你的类中添加一个 toString 实现
  • 我希望有一些默认实现,到 json、xml 甚至二进制。但正如我所说,我从 kafka 开始,并尝试以更简单的方式使用它。
  • 鉴于 C# 没有默认的 JSON 或 XML 库,假设您知道如何使用 C# 的序列化接口,那么二进制将是一个选项
  • 我要使用 json,这对于用肉眼读取服务之间交换的消息很有用。我正在远离 MSMQ,而 kafka 则完全不同。
  • Avro 也可以用肉眼检查。例如,看看像 KSQL 这样的服务。这样做的好处是您的主题的吞吐量要大得多,并且几乎所有外部 Kafka 服务都使用 Confluent Schema Registry API 来做非常酷的事情

标签: c# apache-kafka kafka-producer-api confluent-platform


【解决方案1】:

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


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

或者您可以使用built-in ones


但是,use Avro 的替代方法是

这需要编写一个Avro schema file,然后使用avrogen 来创建你的类,而不是手动编写它。例如

dotnet tool install --global Apache.Avro.Tools

avrogen -s User.avsc .

那么你必须always add some ValueSerializer in Kafka clients才能发送数据

【讨论】:

  • 我期待我可以使用一些通用的内置序列化程序,但无论如何都可以。
  • 你可以。实现ToString,然后使用StringSerializer
  • 在上面的示例中,我看到有一个字符串schemaRegistryUrl。它作为Main 的参数提供。我想知道这个值是什么样子的。谢谢。
  • @BercoviciAdrian 它只是注册 HTTP 端点。 http://registry.address:8081
  • 我真的不明白如何从 C# 模型中将其写入 KSQL (Kafka) 和 AVRO,反之亦然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2022-01-04
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
相关资源
最近更新 更多