为什么需要“二次”解码器
参考文献:极客时间傅健老师的《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