Fork me on GitHub

JSON 和 ProtoBuf序列化

注意:所有文章除特别说明外,转载请注明出处.

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. 编码成二进制流进行传输或存储

更加的适用于高性能、快速响应的场景。因为其是二进制数据格式,数据序列化之后,更加的适合在网络中进行传输。

本文标题:JSON 和 ProtoBuf序列化

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:08:13

原始链接:http://bangjinhu.github.io/undefined/JSON 和 ProtoBuf序列化/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.