如何在C#中深度克隆相互关联的对象?

问题描述 投票:5回答:6

哪些是最好的方法?深入 克隆一组相互关联的对象? 例子。

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

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

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

很明显要做的就是在对象间走动,然后在我走到的时候深层克隆所有的对象。然而这就产生了一个问题--如果我克隆一个 A 其中包含 B,而且 B 也是在 Container,即 B 将会被克隆两次,在我克隆了 Container.

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

有什么想法吗?

c# clone
6个回答
2
投票

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


2
投票

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


2
投票

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


0
投票

也许可以创建一个位标志来表示这个对象是否曾经被克隆过。


0
投票

另一个可能的解决方案是将对象序列化成一个流,然后从同一个流中重新构造成新的实例。当其他一切都显得非常复杂和混乱的时候,这通常会有奇效。

马克


0
投票

做深度克隆的实用方法之一是将源图序列化,然后反序列化。.NET中的一些序列化器如 DataContractSerializer 甚至 能够处理图形内的循环. 你可以通过查看以下内容来选择最适合你的场景的序列化器。功能对比图.

© www.soinside.com 2019 - 2024. All rights reserved.