我为 Kafka 流写了一个 Serde。我的 Serde 类具有通用类型。当我在 API 方法中显式传递它(覆盖默认值)时它工作正常但是当我通过
Properties
指定它以将其设置为默认值时它不起作用。
所以我查看了docs,它确实告诉我我不能这样做:
如果通过
指定了Serde
,则Properties
类不能有泛型类型,即不能使用类Serde
。这意味着您不能使用通过MySerde<T extends Number> implements Serde<T>
创建的任何Serde
。由于 Java 类型擦除,仅支持完全类型化的Serdes.serdeFrom(Serializer<T>, Deserializer<T>)
类,如Serde
。MySerde implements Serde<MyCustomType>
好的,好的。然而,有 SpecificAvroSerde 在
Properties
中指定时工作得很好,就像这样:
streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, SpecificAvroSerde.class);
这是来自 GitHub 的类定义的前几行
public class SpecificAvroSerde<T extends org.apache.avro.specific.SpecificRecord> implements Serde<T> {
private final Serde<T> inner;
public SpecificAvroSerde() {
inner = Serdes.serdeFrom(new SpecificAvroSerializer<T>(), new SpecificAvroDeserializer<T>());
}
这不是与文档直接矛盾吗?为什么
SpecificAvroSerde
在 Properties
中指定为默认值时工作得很好?