关于 Java 中的序列化,最核心的两个接口为 Serializable
与 Externalizable
。
Serializable
的源码如下:
1 | public interface Serializable { |
Externalizable
的源码如下:
1 | public interface Externalizable extends java.io.Serializable { |
可以看出 Externalizable
继承了 Serializable
接口且额外定义了两个方法。关于它们之前的区别可以参见 What is the difference between Serializable and Externalizable in Java?。具体实现可以跟随 JDK 源码 ObjectOutputStream.writeObject 中的调用链至 ObjectOutputStream.writeOrdinaryObject 可以看出对两个接口的处理差异,此处不再一一分析。
在序列化中,不得不提的就是 transient
关键字,对于该关键字,在 JLS 中只有以下简短的描述:
Variables may be marked transient to indicate that they are not part of the persistent state of an object.
在常见的集合框架类的相关源码中,经常看到 transient
的身影,作者为何要加上此关键字呢?