我们为什么要序列化
举个例子:
下雨天我们要打伞,但是之后我们要把伞折叠起来,方便我们存放。
那么运用到我们java中道理是一样的,我们要将数据分解成字节流,以便存储在文件中或在网络上传输,这叫序列化。
我们要用的时候,就需要将字节流重构成对象,这叫反序列化。
不知道我这么说大家能不能理解。
java原生的序列化(Serializable)
java自己提供序列化而且用起来也非常简单,但是在远程服务调用中很少用它,主要存在以下缺点:
1、无法跨语言。这应该是java序列化最致命的问题了。由于java序列化是java内部私有的协议,其他语言不 支持,导致别的语言无法反序列化,这严重阻碍了它的应用。
2、序列后的码流太大。java序列化的大小是二进制编码的5倍多!
3、序列化性能太低。java序列化的性能只有二进制编码的6.17倍,可见java序列化性能实在太差了。
总结 我们判断一个编码框架的优劣主要从以下几个方面:
1、是否支持跨语言,支持语种是否丰富
2、编码后的码流
3、编解码的性能
4、类库是否小巧,API使用是否方便
5、使用者开发的工作量和难度。
对比一下,java的前3条变现太差,导致在远程服务调用中很少用它。下面我们介绍几个流行的编解码框架。
1. google的Protobuf
Protobuf是google开源的项目,全称 Google Protocol Buffers。
特点:
- 1、结构化数据存储格式(xml,json等)
- 2、高性能编解码技术
- 3、语言和平台无关,扩展性好
- 4、支持java,C++,Python三种语言。
2. Facebook的Thrift
Thrift源于Facebook,2007年Facebook将Thrift做为一个开源项目交给了apache基金会。
特点:
- 1、 Thrift支持多种语言(C++,C#,Cocoa,Erlag,Haskell,java,Ocami,Perl,PHP,Python,Ruby,和SmallTalk)
- 2、Thrift适用了组建大型数据交换及存储工具,对于大型系统中的内部数据传输,相对于Json和xml在性能上和传输大小上都有明显的优势。
- 3、Thrift支持三种比较典型的编码方式。(通用二进制编码,压缩二进制编码,优化的可选字段压缩编解码)
3. JBoss 的 Marshlling (netty 中使用 )
Marshlling 的发音:玛莎丽
JBoss Marshalling是一个java对象的序列化API包,修正了java自带的序列化包的很多问题,但又保持跟java.io.Serializable接口的兼容,同时又增加了一些可调的参数和附加特性,并且这些参数和特性可通过工厂类的配置,,很强大啊有木有。
特点:
- 1、可拔插的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制。
- 2、可拔插的对象替换技术,不需要通过继承的方式。
- 3、可拔插的预定义类缓存表,可以减少序列化的字节数组长度,提升常用类型的对象序列化性能。
- 4、无须实现java.io.Serializable接口
- 5、通过缓存技术提升对象的序列化性能。
- 6、使用非常简单
4、kryo
官方文档中文翻译:http://blog.csdn.net/fanjunjaden/article/details/72823866
1.速度快,序列化后体积小
2.跨语言支持较复杂
5、hessian
1.默认支持跨语言
2.较慢
6、fst
高性能序列化框架FST:http://liuyieyer.iteye.com/blog/2136240
1.fst是完全兼容JDK序列化协议的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右。
7、序列化成json
各个JSON技术的比较详解:http://developer.51cto.com/art/201506/480273.htm
7.1、开源的Jackson
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
而且Jackson社区相对比较活跃,更新速度也比较快。
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
7.2、Google的Gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
7.3、阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
综上4种Json技术的比较,在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
如果只是功能要求,没有性能要求,可以使用google的 Gson ,
如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用 FastJson 将Json转换Bean。
以上所有框架性能测试数据结果:http://developer.51cto.com/art/201506/480273.htm