當序列化物件經由網路傳輸或檔案儲存後,接收端欲將其還原為物件,JVM 必須能找到對應的 .class 檔案。本文透過實驗驗證此機制。
定義可序列化類別 Alien,並建立 FreezeAlien 將其序列化至 file.x。接著將 file.x 複製至不含 Alien.class 的目錄 xfiles,嘗試用 ThawAlien 還原:
// Alien.java
public class Alien implements Serializable { }
// FreezeAlien.java
public class FreezeAlien {
public static void main(String[] args) throws Exception {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("file.x"));
out.writeObject(new Alien());
}
}
// ThawAlien.java (在 xfiles 套件下)
public class ThawAlien {
public static void main(String[] args) throws Exception {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("file.x"));
Object mystery = in.readObject();
System.out.println(mystery.getClass().toString()); // 拋出 ClassNotFoundException
}
}
mystery 參考getClass())時,JVM 找不到 Alien.class,拋出 ClassNotFoundException分散式系統(如 RMI)傳遞序列化物件時,雙端必須共享類別定義。部署時需確保類別檔案可被類別載入器找到,否則雖能傳輸位元組流,卻無法還原為可用的物件實例。