序列化和反序列化
序列化
- 序列化是一种用来处理对象流的机制—即把对象转换为字节序列的过程
反序列化
- 把字节序列恢复为对象的过程称为对象的反序列化
主要用途
- 对象的字节序列可永久地保存到硬盘上,通常存放在文件当中
- 在网络上传输对象的字节序列
序列化的意义
- 持久化java对象
- 当JVM处于运行期的时候,我们可以在Java平台使用可复用的对象
- 现实应用中,JVM停止运行之后希望能够保存指定的对象,以便重新读取
- Java对象在进行网络传输时,需要实现 Serializable 接口解决网络传输问题
Java的序列化机制
- java类通过实现serializable接口实现对序列的序列化
- 通过输出流ObjectOutputStream和输入流ObjectInputStream对目标对象进行转化
- 凡是实现Serializable接口的类都有一个标识序列化版本的静态变量
- java的序列化机制通过serializableUID来验证版本的一致性
- 若没有为目标类配置serializableUID,Java编译器会自动为目标类进行一个摘要算法
- 文件有任何改动,得到的UID就会截然不同
Transient关键字
- transient关键字的作用是控制变量的序列化
- 使用transient关键字修饰的变量,不会被序列化
- 反序列化的时候,transient变量的值会被设为初始值
绕开transient机制的方法
- 通过writeObject和readObject两个私有方法可以使被transient关键字修饰的变量正确被序列化和反序列化
Java序列化总结
- Java序列化只针对对象的变量,不关心对象中的方法
- 父类实现序列化接口,子类会自动实现序列化
- 若被序列化的对象存在引用,则被引用的对象也会被序列化
- 被transient关键字修饰的变量,会被序列化机制忽略
分布式架构下常见的序列化技术
- 随着分布式架构、微服务架构的普及。服务之间的通信成为了最基本的需求。
- 对于序列化而言,如何提升序列化的性能以及解决跨语言问题,成为了重中之重
- 由于Java序列化的数据比较大,传输效率低,不同语言难以识别和对接
- 衍生出了各种序列化技术
XML序列化
- 优点:XML序列化的好处在于可读性好,方便调试
- 缺点:序列化以后的字节码文件比较大,而且效率不高,适用范围小
JSON序列化框架
- json是一种轻量级的数据交换格式
- 相对于xml来说,json字节流更小,可读性更好
- 常见JSON序列化工具
- JackJson
- 阿里开源FastJson
- GSON
Hessian序列化框架
- 支持跨语言传输的二进制序列化协议
- 拥有更好的性能和易用性,且支持多种不同的语言
Avro序列化
- 数据序列化系统
- 设计用于支持大批量数据交换的应用
kyro序列化
- 非常成熟的序列化实现,在Hive、Storm中使用的比较广泛,不能跨语言
- dubbo在2.6版本已经支持了kyro序列化机制。性能由于Hession
protobuf序列化框架
- protobuf是Google提供的一种数据交换格式,独立于语言、独立于平台
- 提供多种语言来实现,如Java、C、Go、Python
- 纯粹的表示层协议,可以和各种协议一起使用
- 使用广泛,空间开销小性能更佳但是使用较为复杂
选型建议
- 对性能要求不高的场景,可以采用基于XML的SOAP协议
- 对性能要求较高,Hession、Protobug、Thrift、avro都可以
- 基于前后端分离,选用JSON较好
- Avro设计理念偏于动态类型语言