Object readUnshared


描述

所述java.io.ObjectInputStream.readUnshared()方法从ObjectInputStream读取“非共享”对象。此方法与readObject相同,不同之处在于它阻止对readObject和readUnshared的后续调用返回对通过此调用获得的反序列化实例的其他引用。具体而言 -

如果调用readUnshared反序列化反向引用(先前已写入流的对象的流表示),则抛出ObjectStreamException

如果readUnshared成功返回,则后续尝试反序列化对readUnshared反序列化的流句柄的反向引用将导致抛出ObjectStreamException。

通过readUnshared反序列化对象会使与返回对象关联的流句柄无效。请注意,这本身并不总能保证readUnshared返回的引用是唯一的; 反序列化对象可以定义readResolve方法,该方法返回对其他方可见的对象,或者readUnshared可以返回可在流中的其他位置或通过外部方式获得的Class对象或枚举常量。如果反序列化对象定义了readResolve方法,并且该方法的调用返回一个数组,那么readUnshared将返回该数组的浅层克隆; 这保证了返回的数组对象是唯一的,并且无法在ObjectInputStream上调用readObject或readUnshared时再次获取,即使已经操作了基础数据流。

覆盖此方法的ObjectInputStream子类只能在拥有“enableSubclassImplementation”SerializablePermission的安全上下文中构造; 在没有此权限的情况下实例化此类子类的任何尝试都将导致抛出SecurityException。

声明

以下是java.io.ObjectInputStream.readUnshared()方法的声明。

public Object readUnshared()

参数

NA

返回值

此方法返回对反序列化对象的引用。

异常

ClassNotFoundException - 如果找不到要反序列化的对象的类。

StreamCorruptedException - 如果流中的控件信息不一致。

ObjectStreamException - 如果要反序列化的对象已经出现在流中。

OptionalDataException - 如果原始数据是下一个流。

IOException - 如果在反序列化期间发生I / O错误。

实例

以下示例显示了java.io.ObjectInputStream.readUnshared()方法的用法。

package com.tutorialspoint;

import java.io.*;

public class ObjectInputStreamDemo {
   public static void main(String[] args) {
      String s = "Hello World";

      try {
         // create a new file with an ObjectOutputStream
         FileOutputStream out = new FileOutputStream("test.txt");
         ObjectOutputStream oout = new ObjectOutputStream(out);

         // write something in the file
         oout.writeUnshared(s);
         oout.flush();

         // create an ObjectInputStream for the file we created before
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));

         // read and print the unshared object
         System.out.println("" + ois.readUnshared());
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

让我们编译并运行上面的程序,这将产生以下结果

Hello World