概况
在程序中为了能直接以 Java 对象的形式进行保存,然后再重新得到该 Java 对象,这就需要序列化能力。序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形式,以方便存储或传输。其实想想就大致清楚基本流程,序列化时将 Java 对象相关的类信息、属性及属性值等等保存起来,反序列化时再根据这些信息构建出 Java 对象。而过程可能涉及到其他对象的引用,所以这里引用的对象的相关信息也要参与序列化。
Java 中进行序列化操作需要实现 Serializable 或 Externalizable 接口。
序列化的作用
提供一种简单又可扩展的对象保存恢复机制。
对于远程调用,能方便对对象进行编码和解码,就像实现对象直接传输。
可以将对象持久化到介质中,就像实现对象直接存储。
允许对象自定义外部存储的格式。
序列化例子
FileOutputStream f = new FileOutputStream("tmp.o");
ObjectOutput s = new ObjectOutputStream(f);
s.writeObject("test");
s.writeObject(new ArrayList());
s.flush();
常见的使用方式是直接将对象写入流中,比如上述例子中,创建了 FileOutputStream 对象,其对应输出到 tmp.o 文件中,然后创建 ObjectOutputStream 对象嵌套前面的输出流。当我们调用 writeObject 方法时即能进行序列化操作。
writeObject 方法这里需要说明下,在对某个对象进行写入时,它其实不仅仅序列化自己,还会去遍历寻找相关引用的其他对象,由自己和其他引用对象组成的一个完整的对象图关系都会被序列化。
对于数组、enum、Class类对象、ObjectStreamClass 和 String 等都会做特殊处理,而其他对象序列化则需要实现 Serializable 或 Externalizable 接口。
反序列化例子
FileInputStream in = new FileInputStream("tmp.o");
ObjectInputStream s = new ObjectInputStream(in);
String test = (String)s.readObject();
List list = (ArrayList)s.readObject();
针对序列化则存在反序列化操作&#x