Home > C#.NET > オブジェクトのディープコピー

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

  • Posted by:
  • 2006年8月 1日 15:04
  • C#.NET

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;
}

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/105
Listed below are links to weblogs that reference
オブジェクトのディープコピー from 爆裂!C#野郎

Home > C#.NET > オブジェクトのディープコピー

Search
Feeds
Tag Cloud
Recommend

SQLパズル 第2版 プログラミングが変わる書き方/考え方
SQLパズル 第2版 プログラミングが変わる書き方/考え方

ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系
ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系

ITアーキテクト vol.1
ITアーキテクト vol.1

オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向における再利用のためのデザインパターン

増補改訂版 Java言語で学ぶデザインパターン入門
増補改訂版 Java言語で学ぶデザインパターン入門

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

J2EEデザインパターン
J2EEデザインパターン

アンチパターン―ソフトウェア危篤患者の救出
アンチパターン―ソフトウェア危篤患者の救出

世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本
世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本

Return to page top