C# でのディープコピー

Muhammad Maisam Abbas 2024年2月16日
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 に保存しました。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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

関連記事 - Csharp Class