オブジェクトのディープコピー

C#では(というかほとんどのオブジェクト指向言語では)、オブジェクトのCloneを行うと参照のみがコピー(シャローコピー)されます。
シャローコピーのときは、値を変更するとコピー元のデータも変更されてしまうので、オブジェクトのバックアップを取りたいときは値そのものをコピー(ディープコピー、ディープクローン)するように実装しなければなりません。

一番簡単な方法はオブジェクトをシリアライズし、それを別オブジェクトにデシリアライズすることです。
汎用的に使えるのですが、オブジェクトがシリアライズ化できる必要があります。
シリアライズ化対応でない場合、そのオブジェクトごとに値の詰め替えを実装しなければなりません。

以下、シリアライズを使用したディープコピーのサンプルです。


/// <summary>
/// オブジェクトをディープコピーする。
/// </summary>
/// <param name="source">コピー元オブジェクトを指定します。</param>
/// <returns>コピー先オブジェクトを返します。</returns>
/// <remarks>このメソッドを使用するには、対象クラスが Serializable できることが前提となります。</remarks>
public static object DeepClone(object source)
{
object target = null;
using (MemoryStream stream = new MemoryStream())
{
// コピー元オブジェクトをシリアライズします。
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, source);
stream.Position = 0;

// シリアライズデータをコピー先オブジェクトにデシリアライズします。
target = formatter.Deserialize(stream);
}

return target;
}

投稿者: ♪ 日時: 2006年08月01日 15:04 このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

トラックバック

このエントリーのトラックバックURL:
http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/105

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)