请参阅
ObjectOutputStream.reset。
重置将忽略任何已写入流的对象的状态。状态被重置为与new相同
ObjectOutputStream。流中的当前点被标记为重置,因此相应的
ObjectInputStream点将在同一点重置。先前写入流中的对象将不会被视为已经存在于流中。它们将再次写入流中。
output.reset();output.writeObject(...);
在写入同一对象之前,请调用reset以确保其更新状态被序列化。否则,它将仅使用对先前写入的对象及其过期状态的反向引用。
或者,你也可以使用
ObjectOutputStream.writeUnshared以下方法。
将“非共享”对象写入
ObjectOutputStream。此方法与相同
writeObject,除了它始终将给定对象写为流中新的唯一对象(与指向先前序列化实例的反向引用相反)。
特别:
通过
writeUnshared写入的对象始终以与新出现的对象(尚未写入流的对象)相同的方式进行序列化,而不管该对象先前是否已写入。
如果
writeObject用于写入先前使用
writeUnshared写入的对象,则将先前的
writeUnshared操作视为对单独对象的写入。换句话说,
ObjectOutputStream将永远不会产生对通过调用写入的对象数据的反向引用
writeUnshared。
虽然通过写入对象
writeUnshared本身并不能保证对对象进行反序列化时可以唯一引用该对象,但是它允许在流中多次定义单个对象,从而使
readUnshared接收方进行的多次调用不会冲突。请注意,上述规则仅适用于用编写的基本级对象
writeUnshared,不适用于要序列化的对象图中任何可传递引用的子对象。
output.writeUnshared(...);
请注意,与结合使用是一种好习惯
ObjectInputStream.readUnshared。
从中读取一个“非共享”对象
ObjectInputStream。此方法与readObject相同,不同之处在于,它防止后续调用
readObject并
readUnshared返回对通过此调用获得的反序列化实例的附加引用。
特别:
如果
readUnshared调用来反序列化反向引用(先前已写入流的对象的流表示形式),
ObjectStreamException则将抛出an
如果
readUnshared成功返回,则随后对反序列化反序列化的流引用进行反序列化的任何尝试
readUnshared都
ObjectStreamException将引发。
通过反序列化对象
readUnshared会使与返回的对象关联的流句柄无效。注意,这本身并不总是保证由返回的引用
readUnshared是唯一的。反序列化的对象可以定义一个
readResolve返回对其他方可见的对象的方法,或者
readUnshared可以返回在流中其他位置或通过外部手段可获得的Class对象或enum常量。如果反序列化的对象定义了一个
readResolve方法,并且对该方法的调用返回了一个数组,则
readUnshared返回该数组的浅表副本;这保证了返回的数组对象是唯一的,并且无法通过调用
readObject或
readUnshared再次获得该数组对象。ObjectInputStream,即使底层数据流已被操纵。
obj = input.readUnshared();



