见ObjectOutputStream.reset
。
重置将忽略已写入流的任何对象的状态。状态被重置为与新的相同ObjectOutputStream
。流中的当前点被标记为重置,因此相应ObjectInputStream
的点将在同一点重置。之前写入流的对象不会被称为已经在流中。它们将再次写入流。
/* prevent using back references */
output.reset();
output.writeObject(...);
在写入同一个对象之前调用 reset 以确保其更新的状态被序列化。否则,它将仅使用对先前写入的具有过时状态的对象的反向引用。
或者,您也可以ObjectOutputStream.writeUnshared
按如下方式使用。
将“未共享”对象写入ObjectOutputStream
. 此方法与 相同writeObject
,只是它始终将给定对象作为流中的新的唯一对象写入(与指向先前序列化实例的反向引用相反)。
具体来说:
虽然写入对象 viawriteUnshared
本身并不能保证在反序列化时对该对象的唯一引用,但它允许在流中多次定义单个对象,这样readUnshared
接收方的多次调用就不会发生冲突。请注意,上述规则仅适用于用 编写的基本级别对象writeUnshared
,不适用于要序列化的对象图中的任何可传递引用的子对象。
output.writeUnshared(...);
请注意,将此与ObjectInputStream.readUnshared
.
从ObjectInputStream
. 此方法与 readObject 相同,只是它防止后续调用readObject
和readUnshared
返回对通过此调用获得的反序列化实例的附加引用。
具体来说:
- 如果
readUnshared
调用反序列化反向引用(先前已写入流的对象的流表示),ObjectStreamException
将抛出
- 如果
readUnshared
成功返回,则任何后续尝试反序列化对反序列化的流句柄的反向引用readUnshared
都将导致ObjectStreamException
抛出 an 。
通过反序列化对象readUnshared
会使与返回的对象关联的流句柄无效。请注意,这本身并不总是保证返回的引用readUnshared
是唯一的;反序列化的对象可以定义一个readResolve
方法,该方法返回一个对其他方可见的对象,或者 readUnshared 可以返回一个Class
对象或常量,该对象或enum
常量可在流中的其他地方或通过外部方式获得。如果反序列化的对象定义了一个readResolve
方法并且该方法的调用返回一个数组,则readUnshared
返回该数组的一个浅克隆;这保证了返回的数组对象是唯一的,并且不能从第二次调用readObject
或 readUnshared 获得ObjectInputStream
,即使底层数据流已被操纵。
obj = input.readUnshared();