序列化

【本质】让对象以流的形式进行传输。

【实现】序列化需要实现 Serializable 或 Externalizable 接口。

默认的序列化机制会忽略 transient 关键字修饰的属性,但自定义序列化不受 transient 影响。

如果一个类是可序列化的,那么它的子类也是可序列化的。

Serializable

实现了 Serializable 接口即可进行序列化,使用默认的序列化机制。

若想进行自定义序列化可以定义以下四个方法:

  • writeObject(反射调用)
  • readObject(反射调用)
  • writeReplace:序列化时,先 writeReplace,后 writeObject,writeReplace 方法返回的对象才是真正的序列化对象。
  • readResolve:反序列化时,先 readObject,后 readResolve,readResolve 方法返回的对象会替换反序列化对象创建的实例。

Externalizable

实现了 Externalizable 接口就必须实现 writeExternal 与 readExternal 两个方法,序列化完全自主控制。

读取对象时,会调用类的无参构造去创建一个新的对象,然后再将被保存对象的属性的值分别填充到新对象中,这就是为什么必须定义一个无参构造。

风险

【兼容性】序列化类一旦被发布,之后一旦对类进行修改,很有可能导致序列化形式不兼容。

【安全性】依靠默认的反序列化机制,很容易得到对象之后遭受非法访问,可以在 writeObject 方法中进行加密。

原文地址:https://www.cnblogs.com/xmsx/p/9774152.html