序列化和反序列化是什么

Java 对象 JVM 退出时会全部销毁,如果需要将对象及状态持久化,就要通过序列化实现,将内存中的对象保存在二进制流中,需要时再将二进制流反序列化为对象。

对象序列化保存的是对象的状态,因此属于类属性的静态变量不会被序列化。

常见的序列化有三种:
Java 原生序列化
  • 实现 Serializabale 标记接口,Java 序列化保留了对象类的元数据(如类、成员变量、继承类信息)以及对象数据,兼容性最好,但不支持跨语言,性能一般。
  • 序列化和反序列化必须保持序列化 ID 的一致,一般使用 private static final long serialVersionUID 定义序列化 ID,如果不设置编译器会根据类的内部实现自动生成该值。
  • 如果是兼容升级不应该修改序列化 ID,防止出错,如果是不兼容升级则需要修改。
Hessian 序列化
  • Hessian 序列化是一种支持动态类型、跨语言、基于对象传输的网络协议。
  • Java 对象序列化的二进制流可以被其它语言反序列化。
  • Hessian 协议的特性:
    1. 自描述序列化类型,不依赖外部描述文件,用一个字节表示常用基础类型,极大缩短二进制流。
    2. 语言无关,支持脚本语言。
    3. 协议简单,比 Java 原生序列化高效。
    4. Hessian 会把复杂对象所有属性存储在一个 Map 中序列化,当父类和子类存在同名成员变量时会先序列化子类再序列化父类,因此子类值会被父类覆盖。
JSON 序列化
  • JSON 序列化就是将数据对象转换为 JSON 字符串,在序列化过程中抛弃了类型信息,所以反序列化时只有提供类型信息才能准确进行。相比前两种方式可读性更好,方便调试。
  • 序列化通常会使用网络传输对象,而对象中往往有敏感数据,容易遭受攻击,Jackson 和 fastjson 等都出现过反序列化漏洞,因此不需要进行序列化的敏感属性传输时应加上 transient 关键字。
  • transient 的作用就是把变量生命周期仅限于内存而不会写到磁盘里持久化,变量会被设为对应数据类型的零值。
posted @ 2022-05-29 23:58  张三丰学Java  阅读(186)  评论(0编辑  收藏  举报