序列化的应用与深入

序列化和反序列化

序列化

  • 序列化是一种用来处理对象流的机制—即把对象转换为字节序列的过程

反序列化

  • 把字节序列恢复为对象的过程称为对象的反序列化

主要用途

  • 对象的字节序列可永久地保存到硬盘上,通常存放在文件当中
  • 在网络上传输对象的字节序列

序列化的意义

  • 持久化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设计理念偏于动态类型语言
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章