[英]How to deep clone interconnected objects in C#?
深度克隆一組相互關聯的對象的最佳方法是什么? 例子:
class A {
B theB; // optional
// ...
}
class B {
A theA; // optional
// ...
}
class Container {
A[] a;
B[] b;
}
顯而易見的事情是遍歷對象並在我遇到它時深度克隆所有內容。 然而,這產生了一個問題-如果我克隆A
包含B
,那B
也是在Container
中, B
將被克隆后,我兩次克隆Container
。
下一個合乎邏輯的步驟是創建一個Dictionary
並在我克隆它之前查找每個對象。 然而,這似乎是一個緩慢而不優雅的解決方案。
有什么想法嗎?
您建議的字典解決方案是我所知道的最好的。 要進一步優化,您可以使用object.GetHashCode()
獲取對象的哈希值,並將其用作字典鍵。 除非您談論巨大的對象樹(數十到數百個數千個對象),否則應該很快。
並不是說我熟悉 C#,但通常任何類型的圖形抓取以進行某種處理都需要一個查找表來停止處理由於循環引用的對象。 所以我認為你需要在這里做同樣的事情。
它肯定不是一個優雅的解決方案,但使用字典(或哈希圖)並不少見。 好處之一是哈希圖具有恆定的查找時間,因此這里的速度並沒有真正受到影響。
進行深度克隆的一種實用方法是序列化然后反序列化源圖。 .NET 中的一些序列化器(如DataContractSerializer
甚至能夠處理圖形中的循環。 您可以通過查看功能比較圖表來選擇最適合您的場景的序列化程序。
也許創建一個位標志來指示此對象之前是否已被克隆。
您可以研究的另一種可能的解決方案是將對象序列化為一個流,然后從同一流中將它們重構為新實例。 當其他一切看起來非常復雜和凌亂時,這通常會產生奇跡。
馬克
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.