Copia profonda in C#

Muhammad Maisam Abbas 12 ottobre 2023
Copia profonda in C#

Questo tutorial introdurrà il metodo per creare una copia completa di un oggetto classe in C#.

Oggetto Deep Copy con la classe BinaryFormatter in C#

Copia profonda significa copiare ogni campo di un oggetto su un altro oggetto, mentre copia superficiale significa creare una nuova istanza di classe e indirizzarla ai valori dell’istanza di classe precedente. Possiamo usare il BinaryFormatter per creare una copia completa di un oggetto di classe in C#. La classe BinaryFormatter legge e scrive oggetti di classe in un flusso in formato binario. Possiamo usare il metodo BinaryFormatter.Serialize() per scrivere il nostro oggetto di classe in un flusso di memoria in C#. Possiamo quindi scrivere lo stesso flusso di memoria su un oggetto con il metodo BinaryFormatter.Deserialize() e restituirlo. Dobbiamo prima contrassegnare la nostra classe con [Serializable] affinché questo approccio funzioni. Il seguente esempio di codice ci mostra come creare una copia completa di un oggetto con la classe BinaryFormatter in C#.

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

Produzione:

Sample 1 = Sample number 1 Sample 2 = Sample number 1

Nel codice precedente, abbiamo creato una copia completa dell’oggetto s1 della classe Sample e l’abbiamo salvata nell’oggetto s2 della stessa classe utilizzando la classe BinarySerializer in C#.

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

Articolo correlato - Csharp Class