对象序列化
在程序运行时,在内存中的对象,希望能够持久化保存对象,则需要讲内存的对象转换为一定的格式,这个过程就是序列化的过程。反过来,程序重新运行,读取数据转换为对象的过程就是反序列化。这个在当我们讲数据存入数据库,再从数据库读取,其实是数据库帮我们做了序列化和反序列化这个过程。另外一个就是网络通信,也需要接收方和发送方分别支持特定格式的序列化和反序列化。
序列化/反序列化其实是要数据有一定的格式,这个格式就是序列化协议,主要关注数据存储和传输。序列化方案很多,主要有三个性能度量指标
- 对象序列化后的字节占位大小
- 序列化和反序列化的性能
- 序列化工具自身的性能
常见的序列化分为下面几类
1.文本序列化
2.二进制序列化
1.文本序列化
文本序列化有两种格式JSON和XML,XML已经很少使用,目前主要就是JSON,他是一种轻量级的数据交换格式,采用文本格式存储和表示数据。
java语言框架:
1.Jackson jackson-core+jackson-databind(流式处理)
2.Gson 谷歌开源的三方库
3.FastJson--用的最广,之前的漏洞问题暴露进行了统一的升级处理
4.Json-lib
2.二进制序列化
二进制java序列化
1.java 原生序列化 实现Serializable接口 ,RMI,EJB采用就是次方案,导致吞吐量受限。
2.高性能框架kryo (主要方法WriteObject,WriteClassAndObject,register)
二进制异构语言序列化
1.PB Protocol Buffers 高性能异构语言序列化框架 ProtoBuf
可以安装命令行 通过编译 proto文件,生成对应的类文件。在开发环境中,可以通过mvn 插件protobuf-java,mvn 命令来进行编译生成
- msgpack
采用packb对数据进行打包,使用unpackd进行解包。除了使用packed方法,msgpack很人性化的提供了另一种打包和解包的方法,这个方法和json打包/解包的方法一样,那就是dumps和loads方法了
数据压缩后 :如果说把json数据的大小比作西瓜大小,那么protobuf就是苹果大小,msgpack呢,则是红豆大小,所以msgpack使用优势还是很明显的