如何实现 JAVA 对象的序列化
Java 中对象的序列化(serialization)允许把采用 Serializable 接口的任何
对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制
不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络连线的
另一端把它们恢复。
使用 sterilization,你可以很容易实现所谓的“lightweight persistence”(轻
量级持久化),让对象的生命周期超越程序的生命周期。Serializtion 机制被引
入到 Java 语言中来有两个原因:(1)JavaBeans 机制用到了 serialization,
及(2)远程方法调用(RMI)允许你自动使用位于网络另一端的对象,就如同使
用本地对象一般。
Serializable 接口
很容易把任何采用 Serializable 接口的对象进行序列化。这个接口不包含任何
方法,所以它对于编译器和 Java 虚拟机(JVM)而言不过是一个标记,向它们声
明自己是可以被序列化的。自从序列化机制引入到这种语言之后,许多标准 Java
类(所有的原始类型封装类,如 Integer 类和 Double 类,所有的容器类,和 Class
类)都重新进行了修改以支持序列化。
为了序列化一个对象,你需要用到输出流 OutputStream,OutputStream 必需被
放入特殊的称作 ObjectOutputStream 的序列化流中。然后,你只需要调用方法
writeObject()来序列化对象并发送到输出流中。为了反序列化一个对象,你需
要把 InputStream 转化进 ObjectInputStream 中,然后调用 readObject()方法。
和往常一样,你需要得到一个对象的引用,所以你也得构造所需类型的对象的
class cast。
序列化机制可以正确处理对象包含的所有引用。所有含有实时引用的连接对象也
会被序列化,就如同所有连接对象的所有连接对象,以此类推。这有时被叫作对
象网络。清单 A 向你显示了如何反序列化一个对象。
清单 A
import java.io.*;
public class Data implements Serializable {
public static void main(String[] args)
throws ClassNotFoundException, IOException {
Data d = new Data();
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("data.out"));
out.writeObject("Data storage");