读者或许会奇怪为什么需要一个对象从它的序列化状态中恢复。举个例子来说,假定我们序列化一个对象,
并通过网络将其作为文件传送给另一台机器。此时,位于另一台机器的程序可以只用文件目录来重新构造这
个对象吗?
回答这个问题的最好方法就是做一个实验。下面这个文件位于本章的子目录下:
} ///:~
该程序并不是捕获和控制违例,而是将违例简单、直接地传递到main()外部,这样便能在命令行报告它们。
程序编译并运行后,将结果产生的file.x 复制到名为xfiles 的子目录,代码如下:
} ///:~
该程序能打开文件,并成功读取mystery 对象中的内容。然而,一旦尝试查找与对象有关的任何资料——这
要求Alien 的Class 对象——Java 虚拟机(JVM)便找不到Alien.class(除非它正好在类路径内,而本例理
应相反)。这样就会得到一个名叫ClassNotFoundException 的违例(同样地,若非能够校验Alien 存在的证
据,否则它等于消失)。
恢复了一个序列化的对象后,如果想对其做更多的事情,必须保证JVM 能在本地类路径或者因特网的其他什
并通过网络将其作为文件传送给另一台机器。此时,位于另一台机器的程序可以只用文件目录来重新构造这
个对象吗?
回答这个问题的最好方法就是做一个实验。下面这个文件位于本章的子目录下:
//: Alien.java
// A serializableclass
import java.io.*;
public class Alien implements Serializable
{
} ///:~
用于创建和序列化一个Alien 对象的文件位于相同的目录下:
//: FreezeAlien.java
// Create a serialized outputfile
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 aserialized file without the
// class of object that'sstored 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 文件。