2009-11-24 189 views
14

例如:对象A包含对象B,其中包含对象C,其中包含对象A.Java序列化是否适用于循环引用?

对象A会正确序列化吗?

评论#9 here表明它不起作用。

相反,XStream指示它处理循环引用。

+0

我明白评论#9的方式,他是在谈论手工执行串行化,不是正式实施缺陷的难度。 – meriton 2009-11-24 19:59:10

+0

是的,我重新读了一下,我认为我同意它意味着手动。 – Brandon 2009-11-24 20:02:54

+0

当您尝试**时会发生什么? – 2009-11-24 19:52:33

回答

14

是的,默认的Java序列化适用于循环引用。在序列化对象C时,该字段将包含对已经序列化的对象A的反向引用,而不是再次序列化它。

+2

有没有关于如何工作的任何文档......我想在我自己的序列化实现之一中处理这个问题。 – 2013-09-25 18:16:03

3

是的,Java序列化适用于循环引用,请阅读here以获取更多信息,以帮助您了解Java序列化可以执行的操作。

+1

感谢您的链接“像循环引用和对单个对象的多个引用这样的特殊情况会被保留,这样当树形图被重新创建时,新的对象不会神奇地出现在对树中另一个对象的引用应该是的地方。” http://java.sun.com/developer/technicalArticles/ALT/serialization/ – Brandon 2009-11-24 20:14:59

0

如果将对象序列化为XML,则可以实际查看引用。子对象只被序列化一次。对已经被序列化的子对象的任何引用(在序列化结构中的任何地方)将简单地指向该文件中的该对象。

但是,序列化循环引用可能会变得有点混乱,所以如果可以的话,您可能想要避免它们。

1

是的。

我做了这个非常非常简单的测试,至少它完成了序列化。我认为这是正确的,但你可以检查一些额外的行。

import java.io.*; 
class A implements Serializable { B b; } 
class B implements Serializable { C c; } 
class C implements Serializable { A a; } 
class Test { 
    public static void main(String [] args) throws IOException { 
     A a = new A(); 
     a.b = new B(); 
     a.b.c = new C(); 
     a.b.c.a = a; 
     new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(a); 
     System.out.println("It works"); 

    }  
}