Java Java.io.ObjectInputStream.readUnshared() 方法

  • 描述

    java.io.ObjectInputStream.readUnshared()方法从ObjectInputStream读取“非共享”对象。此方法与readObject相同,除了它防止随后对readObject和readUnshared的调用返回对通过此调用获得的反序列化实例的附加引用。
    • 如果调用readUnshared来反序列化反向引用(先前已写入流的对象的流表示形式),则将抛出ObjectStreamException
    • 如果readUnshared成功返回,则任何随后的尝试反序列化由readUnshared反序列化的流句柄的反向引用都将引发ObjectStreamException。
    通过readUnshared反序列化对象会使与返回的对象关联的流句柄无效。请注意,这本身并不总是保证readUnshared返回的引用是唯一的。反序列化的对象可以定义一个readResolve方法,该方法返回对其他方可见的对象,或者readUnshared返回一个Class对象或枚举常量,该对象或枚举常量可以在流中的其他位置或通过外部方式获得。如果反序列化的对象定义了readResolve方法,并且对该方法的调用返回了一个数组,则readUnshared返回该数组的浅表副本;这保证了返回的数组对象是唯一的,即使在底层数据流已被操纵的情况下,也无法通过调用ObjectInputStream上的readObject或readUnshared再次获得返回的数组对象。
    只能在具有“ enableSubclassImplementation” SerializablePermission的安全上下文中构造重写此方法的ObjectInputStream子类;在没有此权限的情况下实例化此类子类的任何尝试都将导致引发SecurityException。
  • 声明

    以下是java.io.ObjectInputStream.readUnshared()方法的声明。
     public Object readUnshared()
  • 参数

    不适用
  • 返回值

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

    • ClassNotFoundException如果找不到要反序列化的对象的类。
    • StreamCorruptedException如果流中的控制信息不一致。
    • ObjectStreamException如果要反序列化的对象已经出现在流中。
    • OptionalDataException如果原始数据是流中的下一个。
    • IOException如果在反序列化期间发生I / O错误。
  • 例子

    以下示例显示java.io.ObjectInputStream.readUnshared()方法的用法。
     
    package com.jc2182;
    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