ObjectOutputStream.writeObject(Object):序列化寫入。ObjectInputStream.readObject():反序列化讀取。Serializable(標記介面)或 Externalizable(完全自控序列化行為)的類才可序列化。// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("obj.dat"));
out.writeObject("Hello");
out.writeObject(new Date());
out.writeObject(new Customer("Amy", 24));
out.writeInt(123);
out.close();
// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("obj.dat"));
System.out.println((String) in.readObject());
System.out.println((Date) in.readObject());
System.out.println((Customer) in.readObject());
System.out.println(in.readInt());
in.close();
Hello
Sat Sep 26 22:02:21 CST 2010
name=Amy, age=24
123
序列化執行期會檢查 serialVersionUID 一致性,不一致拋出 InvalidClassException。兩種生成策略:
private static final long serialVersionUID = 1L; —— 簡單、穩定,手動控制兼容性。最佳實踐:永遠顯式宣告 serialVersionUID,避免編譯器隱式生成導致跨 JVM/版本不兼容。
implements Cloneable + 覆寫 clone() 呼叫 super.clone()。clone() 中對引用欄位逐一 clone()。ByteArrayOutputStream,再讀回,自動獲得深複製(要求物件圖全可序列化)。| 場景 | 推薦方案 |
|---|---|
| 簡單不可變物件 / 僅基本型別欄位 | 淺複製 |
| 複雜可變物件圖、需完全隔離副本 | 深複製(序列化法最省碼) |
| 跨進程/跨機器傳輸 | 序列化(標準協議) |
| 高頻、大對象、效能敏感 | 考慮 Protobuf/Kryo 等高效二進制方案 |