注意:所有文章除特别说明外,转载请注明出处.
JSON 和 ProtoBuf序列化
[TOC]
JSON
在开发远程过程调用(RPC)程序时候,会涉及到对象的序列化与反序列化问题。如:Person对象从客户端通过TCP方式发送到服务器端。(因为TCP协议只能发送字节流,所以需要应用层将Person对象序列化成字节流)。
注意:在使用JSON或者ProtoBuf时,需要保证ByteBuf二进制包是完整的二进制包。不能是半包或粘包。
粘包
多个发送端的输入ByteBuf粘在一起的时候称之为粘包。
半包
一个输入的ByteBuf被拆开读取,读取到一个破碎的包,这种情况下被称之为半包。
拆包
基于上面的粘包和半包的情况,可以在Netty中根据自定义协议,将读取到的进程缓冲区ByteBuf在应用层进行二次拼装,重新组装应用层数据包。这一过程被称之为拆包。
这里主要有两种方式实现这一过程:
1. 自定义解码器分包器:基于ByteToMessgeDecoder或者ReplayingDecoder,定义自己的进程缓冲区分包器。
2. 使用Netty内置的解码器。(如:LengthFieldBasedFrameDecoder自定义分隔符数据包解码器,对缓冲区ByteBuf进行正确的分包)。
JSON 协议通信
JSON 序列化通用类
1. 阿里的FastJson
2. 谷歌的Gson
3. 开源社区的 Jackson
一般是Gson库与阿里的FastJson两者的结合使用。JSON序列化时,使用Gson库。反序列化时,阿里的FastJson库。
ProtoBuf 协议通信
ProtoBuf是谷歌的一种数据交换的格式,是一套类似于JSON或者XML的数据传输格式和规范。用于不同应用或进程之间的通信。
ProtoBuf的编码过程:
1. 使用预先定义的Message数据结构将实际的传输数据进行打包
2. 编码成二进制流进行传输或存储
更加的适用于高性能、快速响应的场景。因为其是二进制数据格式,数据序列化之后,更加的适合在网络中进行传输。