序列化
kafka序列化消息是在生产端,序列化后,消息才能网络传输。而构造KafkaProducer代码如下:
属性key.serializer和value.serializer就是key和value指定的序列化方式。无论是key还是value序列化和反序列化实现都是一样的,所以接下来都只以value的序列化和反序列为例。
StringSerializer
StringSerializer是内置的字符串序列化方式,核心源码如下:
自定义序列化
和内置的StringSerializer字符串序列化一样,如果要自定义序列化方式,需要实现接口Serializer。假设每个字段按照下图所示的方式自定义序列化:
image.png
下面是一个简单的自定义实现(假设自定义Order类型的Serializer,Order类中有一些String,Integer,Long,Date类型的属性--其他类型暂不支持,读者可以自行扩展):
反序列化
kafka反序列化消息是在消费端。由于网络传输过来的是byte[],只有反序列化后才能得到生产者发送的真实的消息内容。而构造KafkaConsumer代码如下:
属性key.deserializer和value.deserializer就是key和value指定的反序列化方式。
StringDeserializer
StringDeserializer是内置的字符串反序列化方式,核心源码如下:
自定义反序列化
和内置的StringDeserializer字符串反序列化一样,如果要自定义反序列化方式,需要实现接口Deserializer。下面是一个简单的自定义实现(假设自定义Order类型的Deserializer,Order类中有一些String,Integer,Long,Date类型的属性--其他类型暂不支持),反序列化就是根据序列化的方式得到序列化前的内容:
总结
可以看到,自定义Serializer和Deserializer非常痛苦,而且上面还有很多异常情况没有处理,还有很多类型不支持,非常脆弱。复杂类型的支持更是一件痛苦的事情,不同版本之间的兼容性问题更是一个极大的挑战。由于Serializer和Deserializer影响到上下游系统,导致牵一发而动全身。自定义序列化&反序列化实现不是能力的体现,而是逗比的体现。所以强烈不建议自定义实现序列化&反序列化,推荐直接使用StringSerializer和StringDeserializer,然后使用json作为标准的数据传输格式。站在巨人的肩膀上,事半功倍。
领取专属 10元无门槛券
私享最新 技术干货