- 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;
}
- Newer: 【ASP.NET】Page以外でポストバックかどうかを判別する
- Older: 【ASP.NET】URLの書き換え
Comments:0
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#野郎