Java.io.ObjectInputStream.readUnshared() 方法
描述
java.io.ObjectInputStream.readUnshared() 方法从 ObjectInputStream 读取"unshared"对象。 此方法与 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