我来回答你的问题,我感觉你的这个问题首先你要先对ObjectOutputStream有一个很好的了解,
ObjectInputStream主要的作用是对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,
或者用于编组和解组远程通信系统中的实参和形参。 ObjectInputStream 确保从流创建的图形中所有对象的类型
与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。
默认情况下,对象的反序列化机制会将每个字段的内容恢复为写入时它所具有的值和类型。
反序列化进程将忽略声明为瞬态或静态的字段。对其他对象的引用使得根据需要从流中读取这些对象。
使用引用共享机制能够正确地恢复对象的图形。反序列化时始终分配新对象,这样可以避免现有对象被重写。
我给你举一个例子,例如,要从由 ObjectOutputStream 中的示例写入的流读取,编码如下;
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();
另外,使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.
ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.
因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个
ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个
ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的
writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?
则调用
super.writeStreamHeader();
若否,
即以追加方式写入object时,则应调用
ObjectOutputStream.reset()方法.
希望对你有所帮助,不对之处,还望留言! |