5

深度克隆一组相互关联的对象的最佳方法是什么?例子:

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

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

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

显而易见的事情是遍历对象并深入克隆所有内容。然而,这会产生一个问题——如果我克隆一个A包含 aB并且B也在 中的Container,那么B在我克隆Container.

下一个合乎逻辑的步骤是在克隆它之前创建Dictionary并查找每个对象。然而,这似乎是一个缓慢且不优雅的解决方案。

有什么想法吗?

4

6 回答 6

2

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

于 2009-03-25T21:09:58.027 回答
2

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

于 2009-03-25T21:10:54.733 回答
2

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

于 2009-03-25T21:11:08.773 回答
0

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

于 2009-03-25T21:11:59.347 回答
0

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

马克

于 2009-03-25T21:30:37.603 回答
0

进行深度克隆的一种实用方法是序列化然后反序列化源图。.NET 中的一些序列化程序DataContractSerializer甚至能够处理图中的循环。您可以通过查看功能比较表来选择最适合您的场景的序列化程序。

于 2015-07-08T04:44:47.643 回答