【发布时间】: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