【本质】让对象以流的形式进行传输。
【实现】序列化需要实现 Serializable 或 Externalizable 接口。
默认的序列化机制会忽略 transient 关键字修饰的属性,但自定义序列化不受 transient 影响。
如果一个类是可序列化的,那么它的子类也是可序列化的。
Serializable
实现了 Serializable 接口即可进行序列化,使用默认的序列化机制。
若想进行自定义序列化可以定义以下四个方法:
- writeObject(反射调用)
- readObject(反射调用)
- writeReplace:序列化时,先 writeReplace,后 writeObject,writeReplace 方法返回的对象才是真正的序列化对象。
- readResolve:反序列化时,先 readObject,后 readResolve,readResolve 方法返回的对象会替换反序列化对象创建的实例。
Externalizable
实现了 Externalizable 接口就必须实现 writeExternal 与 readExternal 两个方法,序列化完全自主控制。
读取对象时,会调用类的无参构造去创建一个新的对象,然后再将被保存对象的属性的值分别填充到新对象中,这就是为什么必须定义一个无参构造。
风险
【兼容性】序列化类一旦被发布,之后一旦对类进行修改,很有可能导致序列化形式不兼容。
【安全性】依靠默认的反序列化机制,很容易得到对象之后遭受非法访问,可以在 writeObject 方法中进行加密。