所有类


java.io
类 ObjectOutputStream

java.lang.Object
  继承者 java.io.OutputStream
      继承者 java.io.ObjectOutputStream
所有已实现的接口:
Closeable, DataOutput, Flushable, ObjectOutput, ObjectStreamConstants

public class ObjectOutputStream
   
   
   
   
   
extends OutputStream
implements ObjectOutput, ObjectStreamConstants

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过使用流中的文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

还可以使用 DataOutput 中的适当方法将基本数据类型写入流中。还可以使用 writeUTF 方法写入字符串。

对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。其他对象的引用(瞬态和静态字段除外)也会导致写入那些对象。可使用引用共享机制对单个对象的多个引用进行编码,这样即可将对象的图形还原为最初写入它们时的形状。

例如,要写入可通过 ObjectInputStream 中的示例读取的对象,请执行以下操作:

        FileOutputStream fos = new FileOutputStream("t.tmp");
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeInt(12345);
        oos.writeObject("Today");
        oos.writeObject(new Date());

        oos.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 接口的任何对象的字段。不可序列化的 Object 的子类可以是可序列化的。在此情况下,不可序列化的类必须有一个无参数构造方法,以便允许初始化其字段。在此情况下,子类负责保存和还原不可序列化的类的状态。经常出现的情况是,该类的字段是可访问的(public、package 或 protected),或者存在可用来还原状态的 get 和 set 方法。

实现 writeObject 和 readObject 方法可以阻止对象的序列化,这时抛出 NotSerializableException。ObjectOutputStream 导致发生异常并中止序列化进程。

实现 Externalizable 接口允许对象假定可以完全控制对象的序列化形式的内容和格式。调用 Externalizable 接口的方法(writeExternal 和 readExternal)来保存和恢复对象的状态。通过类实现时,它们可以使用 ObjectOutput 和 ObjectInput 的所有方法读写它们自己的状态。对象负责处理出现的任何版本控制。

Enum 常量的序列化不同于普通的 serializable 或 externalizable 对象。enum 常量的序列化形式只包含其名称;常量的字段值不被传送。为了序列化 enum 常量,ObjectOutputStream 需要写入由常量的名称方法返回的字符串。与其他 serializable 或 externalizable 对象一样,enum 常量可以作为序列化流中后续出现的 back 引用的目标。用于序列化 enum 常量的进程不可定制;在序列化期间,由 enum 类型定义的所有类特定的 writeObject 和 writeReplace 方法都将被忽略。类似地,任何 serialPersistentFields 或 serialVersionUID 字段声明也将被忽略,所有 enum 类型都有一个 0L 的固定的 serialVersionUID。

基本数据(不包括 serializable 字段和 externalizable 数据)以块数据记录的形式写入 ObjectOutputStream 中。块数据记录由头部和数据组成。块数据部分包括标记和跟在部分后面的字节数。连续的基本写入数据被合并在一个块数据记录中。块数据记录的分块因子为 1024 字节。每个块数据记录都将填满 1024 字节,或者在终止块数据模式时被写入。调用 ObjectOutputStream 方法 writeObject、defaultWriteObject 和 writeFields 最初只是终止所有现有块数据记录。

从以下版本开始:
JDK1.1
另请参见:
DataOutput, ObjectInputStream, Serializable, Externalizable, Object Serialization Specification, Section 2, Object Output Classes

嵌套类摘要
static classObjectOutputStream.PutField
          提供对要写入 ObjectOutput 的持久字段的编程访问。
 
字段摘要
 
从接口 java.io.ObjectStreamConstants 继承的字段
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
 
构造方法摘要
protected ObjectOutputStream()
          为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。
 ObjectOutputStream(OutputStream out)
          创建写入指定 OutputStream 的 ObjectOutputStream。
 
方法摘要
protected  voidannotateClass(Class<?> cl)
          子类可以实现此方法,从而允许在流中存储类数据。
protected  voidannotateProxyClass(Class<?> cl)
          一些子类可以实现此方法,从而在流中存储定制数据和动态代理类的描述符。
 voidclose()
          关闭流。
 voiddefaultWriteObject()
          将当前类的非静态和非瞬态字段写入此流。
protected  voiddrain()
          排空 ObjectOutputStream 中的所有已缓冲数据。
protected  booleanenableReplaceObject(boolean enable)
          允许流对流中的对象进行替换。
 voidflush()
          刷新该流的缓冲。
 ObjectOutputStream.PutFieldputFields()
          检索用于缓冲写入流中的持久存储字段的对象。
protected  ObjectreplaceObject(Object obj)
          在序列化期间,此方法允许 ObjectOutputStream 的受信任子类使用一个对象替代另一个对象。
 voidreset()
          重置将丢弃已写入流中的所有对象的状态。
 voiduseProtocolVersion(int version)
          指定要在写入流时使用的流协议版本。
 voidwrite(byte[] buf)
          写入一个字节数组。
 voidwrite(byte[] buf, int off, int len)
          写入字节的子数组。
 voidwrite(int val)
          写入一个字节。
 voidwriteBoolean(boolean val)
          写入一个 boolean 值。
 voidwriteByte(int val)
          写入一个 8 位字节。
 voidwriteBytes(String str)
          以字节序列形式写入一个 String。
 voidwriteChar(int val)
          写入一个 16 位的 char 值。
 voidwriteChars(String str)
          以 char 序列形式写入一个 String。
protected  voidwriteClassDescriptor(ObjectStreamClass desc)
          将指定的类描述符写入 ObjectOutputStream。
 voidwriteDouble(double val)
          写入一个 64 位的 double 值。
 voidwriteFields()
          将已缓冲的字段写入流中。
 voidwriteFloat(float val)
          写入一个 32 位的 float 值。
 voidwriteInt(int val)
          写入一个 32 位的 int 值。
 voidwriteLong(long val)
          写入一个 64 位的 long 值。
 voidwriteObject(Object obj)
          将指定的对象写入 ObjectOutputStream。
protected  voidwriteObjectOverride(Object obj)
          子类用于重写默认 writeObject 方法的方法。
 voidwriteShort(int val)
          写入一个 16 位的 short 值。
protected  voidwriteStreamHeader()
          提供 writeStreamHeader 方法,这样子类可以将其部分追加或预加到流中。
 voidwriteUnshared(Object obj)
          将“未共享”对象写入 ObjectOutputStream。
 voidwriteUTF(String str)
          以 UTF-8 修改版格式写入此 String 的基本数据。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

ObjectOutputStream

public ObjectOutputStream(OutputStream out)
                   throws IOException
创建写入指定 OutputStream 的 ObjectOutputStream。此构造方法将序列化流部分写入基础流;调用方可以通过立即刷新流,确保在读取头部时,用于接收 ObjectInputStreams 构造方法不会阻塞。

如果安装了安全管理器,则在通过重写 ObjectOutputStream.putFields 或 ObjectOutputStream.writeUnshared 方法的子类的构造方法来直接或间接调用此构造方法时,它将对 "enableSubclassImplementation" SerializablePermission 进行检查。

参数:
out - 要写入数据的输出流
抛出:
IOException - 如果在写入流部分时发生 I/O 错误
SecurityException - 如果不受信任的子类非法重写安全敏感方法
NullPointerException - 如果 outnull
另请参见:
ObjectOutputStream(), putFields(), ObjectInputStream.ObjectInputStream(InputStream)

ObjectOutputStream

protected ObjectOutputStream()
                      throws IOException,
                             SecurityException
为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。

如果已经安装了安全管理器,则此方法首先利用 SerializablePermission("enableSubclassImplementation") 权限调用安全管理器的 checkPermission 方法,以确保可以启用子类化。

抛出:
SecurityException - 如果安全管理器存在,且其 checkPermission 方法不允许启用子类化。
IOException
另请参见:
SecurityManager.checkPermission(java.security.Permission), SerializablePermission
方法详细信息

useProtocolVersion

public void useProtocolVersion(int version)
                        throws IOException
指定要在写入流时使用的流协议版本。

此例程提供了一个挂钩,允许以与旧版的流格式向后兼容的格式写入当前版的 Serialization。

我们将尽最大努力避免造成额外的向后不兼容性;但有时没有其他替代方法。

参数:
version - 根据 java.io.ObjectStreamConstants 使用 ProtocolVersion。
抛出:
IllegalStateException - 如果在已序列化所有对象后调用。
IllegalArgumentException - 如果传入的版本无效。
IOException - 如果发生 I/O 错误
从以下版本开始:
1.2
另请参见:
ObjectStreamConstants.PROTOCOL_VERSION_1, ObjectStreamConstants.PROTOCOL_VERSION_2

writeObject

public final void writeObject(Object obj)
                       throws IOException
将指定的对象写入 ObjectOutputStream。对象的类、类的签名,以及类及其所有超类型的非瞬态和非静态字段的值都将被写入。可以使用 writeObject 和 readObject 方法重写类的默认序列化。由此对象引用的对象是以可变迁的方式写入的,这样,可以通过 ObjectInputStream 重新构造这些对象的完全等价的图形。

当 OutputStream 中出现问题或者遇到不应序列化的类时,将抛出异常。所有异常对于 OutputStream 而言都是致命的,使其处于不确定状态;并由调用方来忽略或恢复流的状态。

指定者:
接口 ObjectOutput 中的 writeObject
参数:
obj - 要写入的对象
抛出:
InvalidClassException - 序列化操作使用的类出了问题。
NotSerializableException - 某个要序列化的对象不能实现 java.io.Serializable 接口。
IOException - 由基础 OutputStream 抛出的任何异常。

writeObjectOverride

protected void writeObjectOverride(Object obj)
                            throws IOException
子类用于重写默认 writeObject 方法的方法。此方法由 ObjectInputStream 的受信任子类调用,可以使用受保护的无参数构造方法来构造 ObjectInputStream。子类需要使用修饰符 "final" 提供重写方法。

参数:
obj - 要写入基础流的对象
抛出:
IOException - 如果写入基础流时发生 I/O 错误
从以下版本开始:
1.2
另请参见:
ObjectOutputStream(), writeObject(Object)

writeUnshared

public void writeUnshared(Object obj)
                   throws IOException
将“未共享”对象写入 ObjectOutputStream。此方法等同于 writeObject,不同点在于它总是将给定对象作为流中惟一的新对象进行写入(相对于指向以前序列化实例的 back 引用而言)。尤其是:
  • 通过 writeUnshared 写入的对象总是作为新出现对象(未曾将对象写入流中)被序列化,不管该对象以前是否已经被写入过。
  • 如果使用 writeObject 写入以前通过 writeUnshared 写入的对象,则可将以前的 writeUnshared 操作视为写入一个单独对象。换句话说,ObjectOutputStream 永远不会生成通过调用 writeUnshared 写入的对象数据的 back 引用。
虽然通过 writeUnshared 写入对象本身不能保证反序列化对象时对象引用的惟一性,但它允许在流中多次定义单个对象,因此接收方对 readUnshared 的多个调用不会引发冲突。注意,上述规则仅应用于通过 writeUnshared 写入的基层对象,而不能应用于要序列化的对象图形中的任何可变迁方式引用的子对象。

重写此方法的 ObjectOutputStream 子类只能在处理 "enableSubclassImplementation" SerializablePermission 的安全上下文中构造;在不具有此权限的情况下,任何实例化这种子类的尝试都将导致抛出 SecurityException。

参数:
obj - 要写入流的对象
抛出:
NotSerializableException - 如果要序列化的图形中的对象不能实现 Serializable 接口
InvalidClassException - 如果要序列化的对象的类存在问题
IOException - 如果序列化期间发生 I/O 错误

defaultWriteObject

public void defaultWriteObject()
                        throws IOException
将当前类的非静态和非瞬态字段写入此流。此字段只能从正在序列化的类的 writeObject 方法中调用。如果从其他地方调用该字段,则将抛出 NotActiveException。

抛出:
IOException - 如果在写入基础 OutputStream 中时发生 I/O 错误

putFields

public ObjectOutputStream.PutField putFields()
                                      throws IOException
检索用于缓冲写入流中的持久存储字段的对象。调用 writeFields 方法时,字段被写入流中。

返回:
保存 serializable 字段的 Putfield 类的实例
抛出:
IOException - 如果发生 I/O 错误
从以下版本开始:
1.2