Copia profunda en C#

Muhammad Maisam Abbas 16 febrero 2024
Copia profunda en C#

Este tutorial presentará el método para crear una copia profunda de un objeto de clase en C#.

Objeto de copia profunda con la clase BinaryFormatter en C#

La copia profunda significa copiar cada campo de un objeto a otro objeto, mientras que la copia superficial significa crear una nueva instancia de clase y apuntarla a los valores de la instancia de clase anterior. Podemos usar el BinaryFormatter para crear una copia profunda de un objeto de clase en C#. La clase BinaryFormatter lee y escribe objetos de clase en una secuencia en formato binario. Podemos usar el método BinaryFormatter.Serialize() para escribir nuestro objeto de clase en un flujo de memoria en C#. Entonces podemos escribir el mismo flujo de memoria en un objeto con el método BinaryFormatter.Deserialize() y devolverlo. Primero tenemos que marcar nuestra clase con [Serializable] para que este enfoque funcione. El siguiente ejemplo de código nos muestra cómo crear una copia profunda de un objeto con la clase BinaryFormatter en 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);
    }
  }
}

Producción :

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

En el código anterior, creamos una copia profunda del objeto s1 de la clase Sample y lo guardamos en el objeto s2 de la misma clase usando la clase BinarySerializer en 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

Artículo relacionado - Csharp Class