为什么需要“二次”解码器

浪尽此生 提交于 2019-12-01 16:05:38

参考文献:极客时间傅健老师的《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等代码,不需要再写其他代码(代价是可读性不好,看不懂...)

我只想做的更好,仅此而已

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!