如何深度克隆C#中的互连对象?

时间:2009-03-25 21:02:43

标签: c# clone

深度克隆互连对象集的最佳方法是什么?例如:

class A {
    B theB; // optional
    // ...
}

class B {
    A theA; // optional
    // ...
}

class Container {
    A[] a;
    B[] b;
}

显而易见的事情是,当我来到它时,走遍对象并深入克隆一切。这会产生一个问题 - 如果我克隆一个包含A的{​​{1}},并且B也在B中,那么Container将是B克隆Container后克隆了两次。

下一个合乎逻辑的步骤是创建Dictionary并在克隆之前查找每个对象。然而,这似乎是一个缓慢而无法解决的问题。

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

你建议的词典解决方案是我所知道的最好的。要进一步优化,可以使用object.GetHashCode()来获取对象的哈希值,并将其用作字典键。除非你在谈论巨大的物体树(10到100个成千上万的物体),否则应该很快。

答案 1 :(得分:2)

并不是说我熟悉C#,但通常任何类型的图表爬行都需要一个查找表来停止处理由于循环引用而导致的对象。所以我认为你需要在这里做同样的事情。

答案 2 :(得分:2)

它肯定不是一个优雅的解决方案,但使用字典(或hashmap)并不罕见。其中一个好处是hashmap具有恒定的查找时间,因此速度在这里并没有真正受到影响。

答案 3 :(得分:0)

可能会创建一个位标志来指示此对象之前是否已克隆过。

答案 4 :(得分:0)

您可以研究的另一种可能的解决方案是将对象序列化为流,然后将它们从同一个流重构为新实例。当其他一切看起来非常复杂和混乱时,这通常会产生奇迹。

马克

答案 5 :(得分:0)

进行深度克隆的一种实用方法是序列化然后反序列化源图。像DataContractSerializer这样的.NET中的一些序列化程序甚至是capable of processing cycles within graphs。您可以通过查看the feature comparison chart来选择哪种序列化程序是您的方案的最佳选择。