KafkaProducer泛型与序列化器必须严格匹配:key.serializer需处理泛型K类型,value.serializer需处理泛型V类型,否则运行时抛ClassCastException;关键配置key.serializer和value.serializer缺一不可,否则启动报ConfigException;自定义序列化器须实现Serializer接口并用全限定名注册。

直接在 Properties 里指定序列化器类的全限定名,KafkaProducer 的泛型参数(K 和 V)必须与你配置的 key.serializer 和 value.serializer 实际处理的类型一致,否则运行时会抛出 ClassCastException 或序列化失败。
关键配置项必须显式设置
KafkaProducer 初始化前,以下两个配置缺一不可:
-
key.serializer:对应泛型K的序列化器,比如K = String就用StringSerializer.class.getName() -
value.serializer:对应泛型V的序列化器,比如V = User就得配自定义的UserSerializer.class.getName()
漏掉任意一个,启动时会报 ConfigException: Invalid value null for configuration key.serializer / value.serializer。
泛型与序列化器类型要严格匹配
不是“写了泛型就自动适配”,而是:泛型声明的是你传入 ProducerRecord 的类型,序列化器负责把它转成 byte[];两者语义必须对齐。
立即学习“Java免费学习笔记(深入)”;
- 写
KafkaProducer<String, User>→key.serializer必须能处理String,value.serializer必须能处理User - 若误配成
IntegerSerializer处理User对象,serialize()方法里强转会直接ClassCastException - 反过来说,如果 value 是
byte[],泛型就该声明为KafkaProducer<?, byte[]>,并配ByteArraySerializer
自定义序列化器的注册方式
实现 org.apache.kafka.common.serialization.Serializer<T> 接口后,按全路径字符串注册:
- 代码中配置:
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.example.UserSerializer"); - 不能只写类名,必须带包名;也不能用
getClass().getName()动态获取(除非确保类加载器可见) - 如果序列化器依赖外部库(如 Jackson),需确保 runtime classpath 中存在对应 jar
常见内置序列化器对照表
根据泛型选对内置类,省去自定义开销:
-
String→StringSerializer -
Integer/Long/Double等包装类 →IntegerSerializer、LongSerializer等 -
byte[]→ByteArraySerializer -
UUID→UUIDSerializer - 复杂对象不建议用
DefaultSerializer(已废弃),应选 Avro、Protobuf 或自定义 JSON 序列化器



















