5

相互接続された一連のオブジェクトをディープクローンする最良の方法は何ですか? 例:

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

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

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

当然行うべきことは、オブジェクトをたどって、到達したすべてのものをディープ クローンすることです。ただし、これにより問題が発生します。Aを含み、BそれBも にあるを複製するとContainerBを複製した後に 2 回複製されContainerます。

次の論理的なステップは、Dictionaryクローンを作成する前に を作成し、すべてのオブジェクトを検索することです。ただし、これは遅くて見苦しい解決策のようです。

何かご意見は?

4

6 に答える 6

2

あなたが提案した辞書ソリューションは、私が知っている最高のものです。さらに最適化するには、object.GetHashCode()を使用してオブジェクトのハッシュを取得し、それを辞書のキーとして使用できます。巨大なオブジェクト ツリー (数十から数十万のオブジェクト) について話している場合を除き、高速である必要があります。

于 2009-03-25T21:09:58.027 に答える
2

私は C# に精通しているわけではありませんが、通常、何らかの処理のためにグラフをクロールする場合は、循環参照のためにルックアップ テーブルでオブジェクトの処理を停止する必要があります。したがって、ここでも同じことを行う必要があると思います。

于 2009-03-25T21:10:54.733 に答える
2

確かに洗練されたソリューションではありませんが、辞書 (またはハッシュマップ) を使用することは珍しくありません。利点の 1 つは、ハッシュマップのルックアップ時間が一定であるため、ここでは速度が実際に低下しないことです。

于 2009-03-25T21:11:08.773 に答える
0

調査できるもう1つの解決策は、オブジェクトをストリームにシリアル化してから、同じストリームから新しいインスタンスに再構築することです。これは、他のすべてがひどく複雑で乱雑に見えるときに、しばしば不思議に機能します。

マーク

于 2009-03-25T21:30:37.603 に答える
0

ディープ クローニングを行う実用的な方法の 1 つは、ソース グラフをシリアル化してから逆シリアル化することです。.NET の一部のシリアライザーは、グラフ内でサイクルを処理することDataContractSerializerさえできます。機能比較表を参照して、シナリオに最適なシリアライザーを選択できます。

于 2015-07-08T04:44:47.643 に答える
0

このオブジェクトが以前に複製されたかどうかを示すビット フラグを作成することもできます。

于 2009-03-25T21:11:59.347 に答える