1、序列化作用
序列化主要是用来解决数据在网络中传输的问题. 在网络中传输的数据必须全是字节。
生产者需要用序列化器( Serializer )把对象转换成字节数组才能通过网络发送给Kafka ,消费者需要用反序列化器( Deserializer )把从Kafka 中收到的字节数组转换成相应的
对象。在入门demo中使用的是org. apache.kafka. common. serialization. StringSerializer ,因为消息类型就是String,除了StringSerializer ,Kafka也提供了其他基本类型的内置序列化反序列化器
2、Kafka内置序列化器和反序列化器:

Serializer ,Deserializer 分别是序列化和反序列化的顶层接口
ExtendedDeserializer ,ExtendedSerializer 是增强类,通过一个内部类Wrapper对具体的实现类进行增强,可以访问header
其他实现类就是Kafka中对基本数据类型和引用类型内置的序列化和反序列化器
Serde就是Serializer和Deserializer结合
| Java类型 | 序列化 | 反序列化 |
|---|---|---|
| int | IntegerSerializer | IntegerDeserializer |
| long | LongSerializer | LongDeserializer |
| double | DoubleSerializer | DoubleDeserializer |
| byte | BytesSerializer | BytesDeserializer |
| byte | ByteArraySerializer | ByteArrayDeserializer |
| byte | ByteBufferSerializer | ByteBufferDeserializer |
| String | StringSerializer | StringDeserializer |
3、序列化器使用配置
序列化使用:只需要在配置中按照
prop.put("XXX序列化器","序列化器的全类名");格式进行配置
注意:生产者使用的序列化器和消费者使用的反序列化器是需要一一对应的,才能正确的编解码。
在入门demo中key和value的序列化和反序列化配置分别是:
pro.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer")
pro.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
pro.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
pro.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
4、序列化器的初始化时机
在KafKaProducer的实例化中进行初始化,具体在KafKaProducer的核心构造方法中,分别读取value.serializer和key.serializer配置的Class名字,利用反射创建对象,然后包装成ExtendedSerializer
if (keySerializer == null) {
/**
* 读取序列化器
*
*config.getConfiguredInstance
(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,Serializer.class))
* 就是通过配置值获取一个 Serializer的接口实例,
ensureExtended就是对这个实例进行增强,
*/
this.keySerializer
= ensureExtended

最低0.47元/天 解锁文章
1815

被折叠的 条评论
为什么被折叠?



