オブジェクトのプロパティは値型であり、次のような状況で浅いコピーを使用できます。
obj myobj2 = (obj)myobj.MemberwiseClone();
ただし、メンバーが参照型である場合など、他の状況では、ディープ コピーが必要です。クラスの助けを借りてSerialization
とDeserialization
のテクニックを使用して、オブジェクトのディープ コピーを取得できます。BinaryFormatter
public static T DeepCopy<T>(T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Context = new StreamingContext(StreamingContextStates.Clone);
formatter.Serialize(ms, other);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
設定の目的StreamingContext
: インターフェイスを実装するか、 、 、 、 などの組み込み属性を使用して、コードに特別なシリアライゼーションおよびデシリアライゼーション ロジックを導入できISerializable
ます。いずれの場合も、引数としてメソッド (およびインターフェイスの場合は特別なコンストラクター) に渡されます。に設定すると、シリアライゼーションの目的についてそのメソッドにヒントが与えられます。OnDeserialized
OnDeserializing
OnSerializing
OnSerialized
StreamingContext
ISerializable
ContextState
Clone
追加情報: (この記事はMSDNからも読むことができます)
浅いコピーとは、新しいオブジェクトを作成してから、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーすることです。フィールドが値型の場合、フィールドのビットごとのコピーが実行されます。参照型の場合、参照はコピーされますが、参照されるオブジェクトはコピーされません。したがって、元のオブジェクトとそのクローンは同じオブジェクトを参照します。
ディープ コピーは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーします。フィールドが値型の場合、フィールドのビットごとのコピーが実行されます。フィールドが参照型の場合、参照されたオブジェクトの新しいコピーが実行されます。