java ObjectOutputStream 的用法详解
阅读原文时间:2021年04月20日阅读:1

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。

可以使用 ObjectInputStream 读取(重构)对象。

通过在流中使用文件可以实现对象的持久存储。

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants

类 ObjectOutputStream 将 Java 对象中的基本数据类型和图元写入到一个 OutputStream 对象中。可使用 ObjectInputStream 读取这些对象。另外使用此流对应的文件能存储这些对象。如果该流是一个网络通讯流,则在另一台主机或另一个处理机上可重建这些对象。

只有支持 java.io.Serializable 接口的对象才能被写入该流。对每个可序列化的对象进行编码,包括相应类的名称和标记,对象的属性和数组值,以及初始化对象时引用的任何其它对象等。

使用 writeObject 将一个对象写入该流。任一对象,包括串和数组,均采用 writeObject 方法被写入。也能将多个对象或基类型对象写入此流。反过来,必须以这些对象被写入的相同类型和相同顺序,从相应的 ObjectInputstream 流中读回这些对象。

基类型也可使用 DataOutput 中的正确方法写入此流。串对象也可使用 writeUTF 方法写入。

一个对象的缺省序列化机制将写入对象的类,类标记和所有的非暂时的和非静态的属性值。其它对象(除暂时的或静态的属性)的引用也将促使以上这些对象被写入。 使用共享机制,对单一对象的多次引用进行编码,以至对象的图元能被存储为与它原来写入时有相同的形状。

例如写入一个对象,此对象能从 ObjectInputStream 中读出:

FileOutputStream ostream = new FileOutputStream("t.tmp");
ObjectOutputStream p = new ObjectOutputStream(ostream);
p.writeInt(12345);
p.writeObject("Today");
p.writeObject(new Date());
p.flush();
ostream.close();

在序列化处理过程中需要特定句柄的类,必须使用如下这些恰当的标记实现特定的方法:

private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException

writeObject 方法负责写特定类的对象的状态,以使相应的 readObject 方法能存储它。此方法不必关心写入对象的父类或子类的状态。使用 writeObject 方法或基本类型支持的 DataOutput 方法将每个域的状态保存到 ObjectOutputStream 中。

序列化操作不能输出没有实现 java.io.Serializable 接口的任一对象的域。非序列化对象的子类可以是序列化的。在这种情况下,非序列化类必须有一个无参构造子,使它的域能被初始化。 在此情况下,子类负责保存和恢复非序列化类的状态。通常情况父类的域是可存储的(公有的、包或保护的),或存在用于恢复它的状态的可使用的获取或设置方法。

实现抛出 NotSerializableException 异常的 writeObject 和 readObject 方法能阻止一个对象的序列化。 ObjectOutputStream 将获取这个异常,并放弃这个序列化过程。实现外部接口可以使对象完全控制此对象序列化形式的内容和格式。调用外部接口的方法:writeExternal 和 readExternal 保存和恢复对象状态。当一个类实现了这些方法时,它们就能使用 ObjectOutput 和 ObjectInput 方法的所有方法写入或读取它们自己的状态。对象负责管理它出现的相应版本。