C# でのディープコピー
このチュートリアルでは、C# でクラスオブジェクトのディープコピーを作成する方法を紹介します。
C# の BinaryFormatter
クラスを使用したディープコピーオブジェクト
ディープコピーとは、オブジェクトのすべてのフィールドを別のオブジェクトにコピーすることを意味し、シャローコピーとは、新しいクラスインスタンスを作成し、それを前のクラスインスタンスの値にポイントすることを意味します。BinaryFormatter
を使用して、C# でクラスオブジェクトのディープコピーを作成できます。BinaryFormatter
クラスは、クラスオブジェクトをバイナリ形式でストリームに読み書きします。BinaryFormatter.Serialize()
メソッドを使用して、クラスオブジェクトを C# のメモリストリームに書き込むことができます。次に、BinaryFormatter.Deserialize()
メソッドを使用して同じメモリストリームをオブジェクトに書き込み、それを返すことができます。このアプローチを機能させるには、最初にクラスに [Serializable]
のマークを付ける必要があります。次のコード例は、C# で BinaryFormatter
クラスを使用してオブジェクトのディープコピーを作成する方法を示しています。
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace deep_copy {
[Serializable]
public class Sample {
public string sampleName { get; set; }
}
static class ext {
public static Sample deepCopy<Sample>(this Sample obj) {
using (var memStream = new MemoryStream()) {
var bFormatter = new BinaryFormatter();
bFormatter.Serialize(memStream, obj);
memStream.Position = 0;
return (Sample)bFormatter.Deserialize(memStream);
}
}
}
class Program {
static void Main(string[] args) {
Sample s1 = new Sample();
s1.sampleName = "Sample number 1";
Sample s2 = s1.deepCopy();
Console.WriteLine("Sample 1 = {0}", s1.sampleName);
Console.WriteLine("Sample 2 = {0}", s2.sampleName);
}
}
}
出力:
Sample 1 = Sample number 1
Sample 2 = Sample number 1
上記のコードでは、クラス Sample
のオブジェクト s1
のディープコピーを作成し、C# の BinarySerializer
クラスを使用して同じクラスのオブジェクト s2
に保存しました。
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn