参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!
上一篇随笔说了解决TCP粘包、半包的一次解码器都是继承的ByteToMessageDecoder,而ByteToMessageDecoder主要是将原始数据流(可能存在粘包、半包问题的数据流)转换为用户数据(是一个字节数组)。所以我们需要二次解码器(都是直接继承MessageToMessageDecoder)将字节数组转换成Java对象。
有人会问能否将两次解码合二为一?这里是不建议的,首先没有分层感,不够清晰,其次就是耦合性太高,Java是最忌讳耦合性高的方案的。
常用的“二次”编解码方式有哪些?
Java序列化(占空间,其他语言不支持),Marshaling,XML(也是占用比较大),JSON(比XML占空间小,但是没有XML那么通用性),MessagePack(比JSON占用空间还小,却没有它可读性好),Protobuf,其他...
如此多的编解码方式该如何选择呢?首先考虑到的是编码后占用空间,因为编解码的作用很大情况下是为了存储和传输。其次是编解码的速度,再一个就是是否追求可读性,最后一个就是多语言支持,例如MessagePack。综上所述比较合适的有JSON,MessagePack和Protobuf。但是最流行的是ProtoBuf。所以下面简单的介绍下Protobuf。
Google ProtoBuf简介
①Protobuf是一个灵活,高效的用于序列化数据的协议
②相比较XML 、JSON,Protobuf更小、更快、更便捷
③Protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以自动生成Java,C++,Python等代码,不需要再写其他代码(代价是可读性不好,看不懂...)