【发布时间】:2015-06-08 01:59:52
【问题描述】:
Java ObjectInputStream 中有两个类似的方法:
和
文档说明:
public Object readUnshared() throws IOException, ClassNotFoundException从 ObjectInputStream 中读取一个“非共享”对象。此方法与 readObject 相同,只是它阻止对 readObject 和 readUnshared 的后续调用返回对通过此调用获得的反序列化实例的附加引用。具体来说:
如果调用 readUnshared 来反序列化反向引用(之前已写入流的对象的流表示),则会抛出 ObjectStreamException。
如果 readUnshared 成功返回,则任何后续尝试反序列化对由 readUnshared 反序列化的流句柄的反向引用将导致抛出 ObjectStreamException。
通过 readUnshared 反序列化对象会使与返回对象关联的流句柄无效。请注意,这本身并不总是保证 readUnshared 返回的引用是唯一的;反序列化的对象可以定义一个 readResolve 方法,该方法返回一个对其他方可见的对象,或者 readUnshared 可以返回一个 Class 对象或枚举常量,可在流中的其他地方或通过外部方式获得。如果反序列化的对象定义了一个 readResolve 方法并且该方法的调用返回一个数组,那么 readUnshared 返回该数组的一个浅表克隆;这保证了返回的数组对象是唯一的,并且不能从 ObjectInputStream 上的 readObject 或 readUnshared 调用第二次获得,即使底层数据流已被操作。
覆盖此方法的ObjectInputStream 子类只能在拥有“enableSubclassImplementation”SerializablePermission 的安全上下文中构建;任何在没有此权限的情况下实例化此类子类的尝试都将导致抛出 SecurityException。
但我想知道是否有人使用.readUnshared() 与.readObject() 对此有实际用途
【问题讨论】:
-
没用过。一种用途是作为协议健全性检查,以确保发件人使用
writeUnshared().如果他不是所描述的异常,则会导致。
标签: java oracle java-7 objectinputstream objectoutputstream