Java序列化和复制对象
我有以下设置:
public class A {
private Set<C> cSet;
}
public class B {
private Set<C> cSet;
}
public class C {}
A和B的cSet可能引用了相同的C实例。我想序列化A和B,这样在反序列化时就不会有重复的C对象。如果我将Java序列化/反序列化为同一个ObjectOutputStream,Java会知道如何做正确的事情吗?或者我最终会得到比最初更多的C实例吗
# 1 楼答案
不,您不会得到超过必要数量的} 在一个“句柄表”中注册所有曾经序列化过的对象。因此,即使在多次调用^{} 时,同一个对象也不会被写入两次
C
实例。这是因为在内部,^{用于^{} 的API文档:
考虑此代码(假定{{CD5>},^ {< CD6>}和^ {< CD1>}是^{} ,并且两者,^ {< CD5>}和^ {CD6>}有一个非瞬时字段^ {CD11>}指向^ {CD1>}的实例):
现在让我们阅读两个对象:
如果直接写入一个对象两次,也可以这样做,例如:
第二个
writeObject
将只写入句柄,而不是对象本身。这意味着当您再次反序列化对象时,将不会得到两个A
实例:通过调用^{} ,可以清除“handle table”,这样流的行为就像新创建的一样
请注意,} ,该方法始终将对象作为新的唯一对象写入流
ObjectOutputStream
还提供了一个方法^{