看来我没有很好地阅读这个问题。您似乎对序列化可能包含循环引用的属性感兴趣。如果这个假设不正确,并且您可以不序列化这些包含循环引用的对象,请参阅下面我的原始答案。
新答案
我认为您需要跟踪哪些对象已被序列化,除非您自己做,否则我看不到这种情况发生。不过应该不会太难。
在这些包含循环引用的对象上,您可以保留一个transient boolean
表示对象是否已经被序列化。然后,您必须覆盖默认的序列化行为,但这只需几行即可完成。
public void writeExternal(ObjectOutput out) {
if(!out.serialized) {
out.serializeMethod();
}
out.serialized = true;
}
原始答案
看看transient
关键字
我想大多数序列化库都会尊重这个transient
关键字。如果一个成员是transient
它意味着被排除在序列化之外。
class Something {
private Dog dog; // I will be serialized upon serialization.
private transient SomethingElse somethingElse; // I will not be serialized upon serialization.
}
class SomethingElse {
private Cat cat; // I will be serialized upon serialization.
private transient Something something; // I will not be serialized upon serialization.
}
如果您有类似于上述场景的递归成员,您可能希望标记一个或另一个(或两者),transient
以便不会发生这种溢出。