OutputStream,支援持久化文件、網絡傳輸、RMI 參數傳遞。InputStream 恢復對象圖,保證類型匹配、按需加載類、正確處理共享引用與循環引用。類必須實作 java.io.Serializable(標記介面)或 Externalizable。
默認機制:遞歸序列化所有非 transient、非 static 域;透過共享機制維護對象圖拓撲;反序列化時分配新對象、調用無參構造子初始化非序列化父類域。
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // 或手寫各域
// 處理敏感域、計算衍生值等
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
// 恢復瞬態域、校驗不變量等
}
Externalizable 完全手動控制:實作 writeExternal(ObjectOutput)/readExternal(ObjectInput),自負版本管理。
public class Logon implements Serializable {
private Date date = new Date();
private String username;
private transient String password; // 不序列化
// 構造子、toString()...
public static void main(String[] args) throws Exception {
Logon a = new Logon("Morgan", "morgan83");
// 序列化
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("Logon.out"));
o.writeObject(a); o.close();
// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("Logon.out"));
a = (Logon) in.readObject();
System.out.println(a); // password 顯示 (n/a)
}
}
serialVersionUID 顯式聲明,避免版本不兼容導致 InvalidClassException。Externalizable 或替代方案(Protobuf、Kryo)。