序列化与反序列化知识点汇总

上一篇 <<<粘包和拆包问题解决方案汇总
下一篇 >>>MessagePack反序列化使用示例


什么是序列化、反序列化?

序列化: 将数据结构或对象转换成二进制串(字节)的过程
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

序列模式

1.对象持久化概念:将对象转换成字节,存放到硬盘或者是数据库中,
2.网络传输对象概念:客户端将对象转成字节的形式(序列化)、变成二进制的形式发送给服务器端,服务器端接受到字节之后,反序列化成对象(rpc远程通讯)
网络传输对象为什么需要序列化?
因为网络无法直接传输对象,对象只存在于内存中,要想网络传输或存储,必须要先序列化。

序列化实现方式

a、原生序列化方式,类必须实现Serializable接口,但是关键字transient修饰的变量是不被序列化的
b、json序列化(有的地方把fastjson也当做是一种更高级的json序列化)
c、谷歌的ProtoBuf方式序列化

网络传输序列化协议有哪些

网络传输序列化还需要考虑跨语言问题。
A、xml格式序列化,不能序列化方法,且重量级,能增加带宽
B、Json格式序列化(fastjson有的也会当做一种),使用key-value方式,缺点是不够精简
C、Hessian
D、MessagePack
E、企业内部自定义协议:(谷歌公司的protobuf、Facebook的Thrift协议、Apache Hadoop公司的Avro)

XML、Json、Hession、ProtocolBuf区别

XML:使用.Net自带的XmlSerializer。
Json:使用的是ServiceStack.Text,性能高于Newtonsoft.Json,但是速度最快的应该是fastJSON.net。
Hessian:使用的是HessianCSharp库, 从nuget上下载。
Protocol Buffers:使用的是protobuf-net,从nuget上下载。

MsgPack和Hessian序列化对比

a、结构:hessian为key-value方式,msgpack为有序的数组
b、性能:msgpack更加精简,性能可提高1-3倍
c、扩展性:hessian可随意添加字段,msgpack必须要保证字段顺序,扩展性不如hessian。
d、其他:
hessian会把map/list集合转为hashmap/arraylist,对linkedhashmap等类型会丢失,支持匿名的map/list集合
msgpack会报了集合类的类型,不支持匿名集合类
总结:为了灵活选择hessian,为了性能选择msgpack。

MessagePack编码器与json有哪些区别

MessagePack去除了json格式的key,所有value按顺序行程数组传输,减少了带宽,且传输更快

结论

1、XML序列化(Xstream)无论在性能和简洁性上比较差。
2、Thrift与Protobuf相比在时空开销方面都有一定的劣势。

3、Protobuf和Avro在两方面表现都非常优越。

选型建议

1、对于公司间的系统调用,如果性能要求在100ms以上的服务,基于XML的SOAP协议是一个值得考虑的方案。
2、基于Web browser的Ajax,以及Mobile app与服务端之间的通讯,JSON协议是首选。对于性能要求不太高,或者以动态类型语言为主,或者传输数据载荷很小的的运用场景,JSON也是非常不错的选择。
3、对于调试环境比较恶劣的场景,采用JSON或XML能够极大的提高调试效率,降低系统开发成本。
4、当对性能和简洁性有极高要求的场景,Protobuf,Thrift,Avro之间具有一定的竞争关系。
5、对于T级别的数据的持久化应用场景,Protobuf和Avro是首要选择。如果持久化后的数据存储在Hadoop子项目里,Avro会是更好的选择。
6、由于Avro的设计理念偏向于动态类型语言,对于动态语言为主的应用场景,Avro是更好的选择。
7、对于持久层非Hadoop项目,以静态类型语言为主的应用场景,Protobuf会更符合静态类型语言工程师的开发习惯。
8、如果需要提供一个完整的RPC解决方案,Thrift是一个好的选择。
9、如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf可以优先考虑。


推荐阅读:
<< << << << << << << << << << << << <<<粘包和拆包问题解决方案汇总
<< <<

你可能感兴趣的:(序列化与反序列化知识点汇总)