java.io 类 ObjectInputStream
2010年11月23日
  java.io 类 ObjectInputStream
  java.lang.Object
  java.io.InputStream
  java.io.ObjectInputStream
  所有已实现的接口:
  Closeable, DataInput, ObjectInput, ObjectStreamConstants
  --------------------------------------------------------------------------------
  public class ObjectInputStreamextends InputStreamimplements ObjectInput, ObjectStreamConstantsObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
  ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。
  ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。
  只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
  readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。
  可以使用 DataInput 上的适当方法从流读取基本数据类型。
  默认情况下,对象的反序列化机制会将每个字段的内容恢复为写入时它所具有的值和类型。反序列化进程将忽略声明为瞬态或静态的字段。对其他对象的引用使得根据需要从流中读取这些对象。使用引用共享机制能够正确地恢复对象的图形。反序列化时始终分配新对象,这样可以避免现有对象被重写。
  读取对象类似于运行新对象的构造方法。为对象分配内存并将其初始化为零 (NULL)。为不可序列化类调用无参数构造方法,然后从以最接近 java.lang.object 的可序列化类开始和以对象的最特定类结束的流恢复可序列化类的字段。
  例如,要从由 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();
  类控制实现 java.io.Serializable 或 java.io.Externalizable 接口时的序列化方式。
  实现 Serializable 接口允许对象序列化,以保存和恢复对象的全部状态,并且允许类在写入流时的状态和从流读取时的状态之间变化。它自动遍历对象之间的引用,保存和恢复全部图形。
  在序列化和反序列化进程中需要特殊处理的 Serializable 类应该实现以下方法:
  private void writeObject(java.io.ObjectOutputStream stream)
  throws IOException;
  private void readObject(java.io.ObjectInputStream stream)
  throws IOException, ClassNotFoundException;
  private void readObjectNoData()
  throws ObjectStreamException;
  readObject 方法负责使用通过对应的 writeObject 方法写入流的数据,为特定类读取和恢复对象的状态。该方法本身的状态,不管是属于其超类还是属于其子类,都没有关系。恢复状态的方法是,从个别字段的 ObjectInputStream 读取数据并将其分配给对象的适当字段。DataInput 支持读取基本数据类型。
  尝试读取由对应的 writeObject 方法写入的超出自定义数据边界的对象数据将导致抛出 OptionalDataException(eof 字段值为 true)。超出已分配数据末尾的非对象读取以指示流末尾的方式反映数据结束:按位读取与字节读取或字节数读取一样,将返回 -1,基元读取将抛出 EOFException。如果不存在对应的 writeObject 方法,则默认的序列化数据的末尾标记已分配数据的末尾。
  从 readExternal 方法发出的基元和对象读取调用的行为方式一样:如果流已经定位在由相应 writeExternal 方法写入的数据末尾,则对象读取将抛出 OptionalDataException(其 eof 设置为 true),按位读取将返回 -1,基元读取将抛出 EOFException。注意,此行为不适用于使用旧 ObjectStreamConstants.PROTOCOL_VERSION_1 协议写入的流,在这些流中,没有划分出由 writeExternal 方法写入的数据末尾,因此无法检测。
  如果序列化流没有将给定类列为要反序列化的对象的超类,则 readObjectNoData 方法负责初始化其特定类的对象状态。在接收方使用的反序列化实例类的版本不同于发送方,并且接收者版本扩展的类不是发送者版本扩展的类时,此事可能发生。如果序列化流已经被篡改,也会发生这种情况;因此,不管源流是“敌意的”还是不完整的,readObjectNoData 方法都可以用来正确地初始化反序列化的对象。
  对于没有实现 java.io.Serializable 接口的任何对象,序列化不会对其字段进行读取或赋值。非 serializable 的 Object 的子类可以为 serializable。在此情况下,非 serializable 类必须具有无参数的构造方法以允许其字段能被初始化。在此情况下,子类负责保存和恢复非 serializable 类的状态。经常出现的情况是,该类的字段是可访问的(public、package 或 protected),或者存在可用于恢复状态的 get 和 set 方法。
  反序列化对象进程中发生的所有异常将由 ObjectInputStream 捕获并将中止读取进程。
  实现 Externalizable 接口允许对象假定可以完全控制对象的序列化形式的内容和格式。调用 Externalizable 接口的方法(writeExternal 和 readExternal)来保存和恢复对象状态。当这两种方法被某个类实现时,它们可以使用 ObjectOutput 和 ObjectInput 的所有方法读写其本身的状态。对象负责处理出现的任何版本控制。
  Enum 常量的反序列化不同于普通的 serializable 或 externalizable 对象。Enum 常量的序列化形式只包含其名称;不传送常量的字段值。要反序列化 enum 常量,ObjectInputStream 需要从流中读取常量的名称;然后将 enum 常量的基本类型和接收到的常量名称作为参数,调用静态方法 Enum.valueOf(Class, String) 获取反序列化的常量。与其他 serializable 或 externalizable 对象一样,enum 常量可以作为序列化流中随后出现的反向引用的目标。不可以自定义 enum 常量的反序列化进程:在反序列化期间,enum 类型所定义的任何与类有关的 readObject、readObjectNoData 和 readResolve 方法都将被忽略。类似地,任何 serialPersistentFields 或 serialVersionUID 字段声明也将被忽略(所有 enum 类型都有一个固定的 0L 的 serialVersionUID)。
  从以下版本开始:
  JDK1.1
  另请参见:
  DataInput, ObjectOutputStream, Serializable, 对象序列化规范:Object Input Classes 第三节
  --------------------------------------------------------------------------------
  嵌套类摘要
  static class ObjectInputStream.GetField
  提供对从输入流读取的持久字段的访问权限。
  字段摘要
  从接口 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 ObjectInputStream()
  为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。
  ObjectInputStream(InputStream in)
  创建从指定 InputStream 读取的 ObjectInputStream。
  方法摘要
  int available()
  返回可以不受阻塞地读取的字节数。
  void close()
  关闭输入流。
  void defaultReadObject()
  从此流读取当前类的非静态和非瞬态字段。
  protected boolean enableResolveObject(boolean enable)
  使流允许从该流读取的对象被替代。
  int read()
  读取数据字节。
  int read(byte[] buf, int off, int len)
  读入 byte 数组。
  boolean readBoolean()
  读取一个 boolean 值。
  byte readByte()
  读取一个 8 位的字节。
  char readChar()
  读取一个 16 位的 char 值。
  protected ObjectStreamClass readClassDescriptor()
  从序列化流读取类描述符。
  double readDouble()
  读取一个 64 位的 double 值。
  ObjectInputStream.GetField readFields()
  按名称从流中读取持久字段并使其可用。
  float readFloat()
  读取一个 32 位的 float 值。
  void readFully(byte[] buf)
  读取字节,同时阻塞直至读取所有字节。
  void readFully(byte[] buf, int off, int len)
  读取字节,同时阻塞直至读取所有字节。
  int readInt()
  读取一个 32 位的 int 值。
  String readLine()
  已过时。 此方法不能正确地将字节转换为字符。请参见 DataInputStream 以获取详细信息和替代方法。
  long readLong()
  读取一个 64 位的 long 值。
  Object readObject()
  从 ObjectInputStream 读取对象。
  protected Object readObjectOverride()
  此方法由 ObjectOutputStream 的受信任子类调用,这些子类使用受保护的无参数构造方法构造 ObjectOutputStream。
  short readShort()
  读取一个 16 位的 short 值。
  protected void readStreamHeader()
  提供的 readStreamHeader 方法允许子类读取并验证它们自己的流头部。
  Object readUnshared()
  从 ObjectInputStream 读取“非共享”对象。
  int readUnsignedByte()
  读取一个无符号的 8 位字节。
  int readUnsignedShort()
  读取一个无符号的 16 位 short 值。
  String readUTF()
  读取 UTF-8 修改版格式的 String。
  void registerValidation(ObjectInputValidation obj, int prio)
  在返回图形前注册要验证的对象。
  protected Class resolveClass(ObjectStreamClass desc)
  加载指定流类描述的本地等价类。
  protected Object resolveObject(Object obj)
  在反序列化期间,此方法允许 ObjectInputStream 的受信任子类使用一个对象替代另一个。
  protected Class resolveProxyClass(String[] interfaces)
  返回一个代理类,该类实现在代理类描述符中命名的接口;子类可以实现此方法,以便从流及动态代理类的描述符中读取自定义数据,允许它们使用接口和代理类的替换加载机制。
  int skipBytes(int len)
  跳过字节。
  从类 java.io.InputStream 继承的方法
  mark, markSupported, read, reset, skip
  从类 java.lang.Object 继承的方法
  clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  从接口 java.io.ObjectInput 继承的方法
  read, skip