using System.Runtime.Serialization.Formatters.Binary;
public static void Main()
var objetoA = new Objeto();
objetoA.SubObjeto = new Objeto();
objetoA.SubObjeto.Valor = "A";
Console.WriteLine($"ObjetoA: {objetoA.Valor}. Sub: {objetoA.SubObjeto.Valor}\n");
objetoB.SubObjeto.Valor = "B";
Console.WriteLine($"ObjetoB: {objetoB.Valor}. Sub: {objetoB.SubObjeto.Valor}");
Console.WriteLine($"ObjetoA: {objetoA.Valor}. Sub: {objetoA.SubObjeto.Valor}\n");
var objetoC = objetoB.ShallowClone();
objetoC.SubObjeto.Valor = "C";
Console.WriteLine($"ObjetoC: {objetoC.Valor}. Sub: {objetoC.SubObjeto.Valor}");
Console.WriteLine($"ObjetoB: {objetoB.Valor}. Sub: {objetoB.SubObjeto.Valor}");
Console.WriteLine($"ObjetoA: {objetoA.Valor}. Sub: {objetoA.SubObjeto.Valor}\n");
var objetoD = objetoC.DeepClone();
objetoD.SubObjeto.Valor = "D";
Console.WriteLine($"ObjetoD: {objetoD.Valor}. Sub: {objetoD.SubObjeto.Valor}");
Console.WriteLine($"ObjetoC: {objetoC.Valor}. Sub: {objetoC.SubObjeto.Valor}");
Console.WriteLine($"ObjetoB: {objetoB.Valor}. Sub: {objetoB.SubObjeto.Valor}");
Console.WriteLine($"ObjetoA: {objetoA.Valor}. Sub: {objetoA.SubObjeto.Valor}");
public string Valor { get; set; }
public Objeto SubObjeto { get; set; }
public Objeto ShallowClone()
return (Objeto)this.MemberwiseClone();
public Objeto DeepClone()
using (var ms = new MemoryStream())
var formatter = new BinaryFormatter();
formatter.Serialize(ms, this);
return (Objeto)formatter.Deserialize(ms);