Java Java.io.ObjectOutputStream.writeUnshared() 方法

  • 描述

    java.io.ObjectOutputStream.writeUnshared(Object obj)方法将一个“未共享”对象写入ObjectOutputStream。此方法与writeObject相同,不同之处在于它始终将给定对象写为流中新的唯一对象(与指向先前序列化实例的反向引用相反)。
    • 通过writeUnshared写入的对象始终以与新出现的对象(尚未写入流的对象)相同的方式进行序列化,而不管该对象先前是否已写入。
    • 如果使用writeObject写入先前使用writeUnshared写入的对象,则将先前的writeUnshared操作视为对单独对象的写入。换句话说,ObjectOutputStream将永远不会生成对通过writeUnshared调用写入的对象数据的反向引用。
    虽然通过writeUnshared写入对象本身并不能保证在反序列化对象时对对象进行唯一引用,但它允许在流中多次定义单个对象,因此接收方对readUnshared的多次调用不会冲突。请注意,上述规则仅适用于使用writeUnshared编写的基本级对象,不适用于要序列化的对象图中的任何可传递引用的子对象。
    覆盖此方法的ObjectOutputStream子类只能在具有“ enableSubclassImplementation” SerializablePermission的安全上下文中构造;在没有此权限的情况下实例化此类子类的任何尝试都将导致引发SecurityException。
  • 声明

    以下是java.io.ObjectOutputStream.writeUnshared()方法的声明。
     public void writeUnshared(Object obj)
  • 参数

    obj写入流的对象。
  • 返回值

    此方法不返回值。
  • 异常

    • NotSerializableException如果图中要序列化的对象未实现Serializable接口。
    • InvalidClassException如果要序列化的对象的类存在问题。
    • IOException如果在序列化期间发生I / O错误。
  • 例子

    以下示例显示java.io.ObjectOutputStream.writeUnshared()方法的用法。
     
    package com.jc2182; 
    import java.io.*;
    
    public class ObjectOutputStreamDemo {
       public static void main(String[] args) {
          Object s = "Hello World!";
          Object i = 1974;
          
          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.writeUnshared(i);
    
             // close the stream
             oout.close();
    
             // create an ObjectInputStream for the file we created before
             ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
    
             // read and print what we wrote before
             System.out.println("" + ois.readUnshared());
             System.out.println("" + ois.readUnshared());
          } catch (Exception ex) {
             ex.printStackTrace();
          }
       }
    }
    
    让我们编译并运行以上程序,这将产生以下结果-
     
    Hello World!
    1974