讀者或許會奇怪為什麼需要一個對象從它的序列化狀態中恢復。舉個例子來說,假定我們序列化一個對象,並通過網絡將其作為文件傳送給另一台機器。此時,位於另一台機器的程序可以只用文件目錄來重新構造這個對象嗎?
回答這個問題的最好方法就是做一個實驗。下面這個文件位於本章的子目錄下:
//: Alien.java // A serializable class import java.io.*; public class Alien implements Serializable { } ///:~
用於創建和序列化一個Alien對象的文件位於相同的目錄下:
//: FreezeAlien.java // Create a serialized output file import java.io.*; public class FreezeAlien { public static void main(String[] args) throws Exception { ObjectOutput out = new ObjectOutputStream( new FileOutputStream("file.x")); Alien zorcon = new Alien(); out.writeObject(zorcon); } } ///:~
該程序並不是捕獲和控制違例,而是將違例簡單、直接地傳遞到main()外部,這樣便能在命令行報告它們。
程序編譯並運行後,將結果產生的file.x復制到名為xfiles的子目錄,代碼如下:
//: ThawAlien.java // Try to recover a serialized file without the // class of object that's stored in that file. package c10.xfiles; import java.io.*; 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()); } } ///:~
該程序能打開文件,並成功讀取mystery對象中的內容。然而,一旦嘗試查找與對象有關的任何資料——這要求Alien的Class對象——Java虛擬機(JVM)便找不到Alien.class(除非它正好在類路徑內,而本例理應相反)。這樣就會得到一個名叫ClassNotFoundException的違例(同樣地,若非能夠校驗Alien存在的證據,否則它等於消失)。
恢復了一個序列化的對象後,如果想對其做更多的事情,必須保證JVM能在本地類路徑或者因特網的其他什麼地方找到相關的.class文件。