Deep Copy em C#

Muhammad Maisam Abbas 16 fevereiro 2024
Deep Copy em C#

Este tutorial irá apresentar o método para criar uma cópia profunda de um objeto de classe em C#.

Objeto de cópia profunda com a classe BinaryFormatter em C#

Cópia profunda significa copiar todos os campos de um objeto para outro objeto, enquanto cópia superficial significa criar uma nova instância de classe e apontá-la para os valores da instância de classe anterior. Podemos usar o BinaryFormatter para criar uma cópia profunda de um objeto de classe em C#. A classe BinaryFormatter lê e grava objetos de classe em um fluxo em formato binário. Podemos usar o método BinaryFormatter.Serialize() para escrever nosso objeto de classe em um fluxo de memória em C#. Podemos então escrever o mesmo fluxo de memória em um objeto com o método BinaryFormatter.Deserialize() e retorná-lo. Precisamos primeiro marcar nossa classe com [Serializable] para que essa abordagem funcione. O exemplo de código a seguir nos mostra como criar uma cópia profunda de um objeto com a classe BinaryFormatter em 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);
    }
  }
}

Resultado:

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

No código acima, criamos uma cópia profunda do objeto s1 da classe Sample e salvamos no objeto s2 da mesma classe usando a classe BinarySerializer em 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

Artigo relacionado - Csharp Class