某專案將使用者設定存於 Hashtable 並序列化持久化。後來團隊決定遷移至 HashMap,卻發現兩者序列化格式不相容,數百萬用戶設定面臨無法讀取的危機。若不知序列化允許類別替換,勢必被迫繼續使用 Hashtable 或編寫龐大轉換工具。
Java 序列化(JDK 1.1 引入)將物件狀態「凍結」為位元組陣列,便於儲存或網路傳輸,稍後可「解凍」還原為可用物件。核心類別:
ObjectOutputStream:寫入物件ObjectInputStream:讀取物件Serializable 標記介面:類別實作即參與序列化協定package com.tedneward;
public class Person implements java.io.Serializable {
public Person(String fn, String ln, int a) {
this.firstName = fn; this.lastName = ln; this.age = a;
}
// getter/setter/toString...
private String firstName, lastName;
private int age;
private Person spouse;
}
public class SerTest {
@Test public void serializeToDisk() {
try {
Person ted = new Person("Ted", "Neward", 39);
Person charl = new Person("Charlotte", "Neward", 38);
ted.setSpouse(charl); charl.setSpouse(ted);
FileOutputStream fos = new FileOutputStream("tempdata.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(ted);
oos.close();
} catch (Exception ex) { fail("Write failed: " + ex); }
try {
FileInputStream fis = new FileInputStream("tempdata.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Person ted = (Person) ois.readObject();
ois.close();
assertEquals(ted.getFirstName(), "Ted");
assertEquals(ted.getSpouse().getFirstName(), "Charlotte");
new File("tempdata.ser").delete();
} catch (Exception ex) { fail("Read failed: " + ex); }
}
}
本系列將揭露 5 個關於 Java 序列化的實用冷知識,幫助你解決遷移、安全、效能等實務挑戰。