I've added an alternative here, which might be useful if the class has a circular reference and you have mastery over it.
You can decorate it with the [DataContract]
and [DataMember]
and serialize its binary using the DataContractSerializer
follow the example.:
var serialize = new DataContractSerializer(typeof(MyClass));
var myClone = default(MyClass);
using (var stream = new MemoryStream())
{
serialize.WriteObject(stream, myObject);
stream.Position = 0;
stream.Flush();
myClone = (MyClass)serialize.ReadObject(stream);
}
For serialization with cyclic references, it is necessary to use the property IsReference
of DataContrac
with value equal to true
;
Here is a complete example.:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
namespace ConsoleApplication2
{
[DataContract(IsReference = true)]
public class Pessoa
{
[DataMember]
public string Nome { get; set; }
[DataMember]
public Pessoa Companheiro { get; set; }
[DataMember]
public Pessoa Pai { get; set; }
[DataMember]
public Pessoa Mae { get; set; }
[DataMember]
public List<Pessoa> Filhos { get; set; }
[DataMember]
public List<Pessoa> Irmaos { get; set; }
}
class Program
{
static void Main(string[] args)
{
var pessoa1 = new Pessoa() { Nome = "Pai" };
var pessoa2 = new Pessoa() { Nome = "Mãe" };
var pessoa3 = new Pessoa() { Nome = "Filho 1" };
var pessoa4 = new Pessoa() { Nome = "Filho 2" };
var pessoa5 = new Pessoa() { Nome = "Filho 3" };
pessoa1.Companheiro = pessoa2;
pessoa2.Companheiro = pessoa1;
pessoa1.Filhos = pessoa2.Filhos = new List<Pessoa> { pessoa3, pessoa4, pessoa5 };
pessoa3.Pai = pessoa4.Pai = pessoa5.Pai = pessoa1;
pessoa3.Mae = pessoa4.Mae = pessoa5.Mae = pessoa2;
pessoa3.Irmaos = new List<Pessoa> { pessoa4, pessoa5 };
pessoa4.Irmaos = new List<Pessoa> { pessoa3, pessoa5 };
pessoa5.Irmaos = new List<Pessoa> { pessoa3, pessoa4 };
var serialize = new DataContractSerializer(typeof(Pessoa));
var clone = default(Pessoa);
using (var stream = new MemoryStream())
{
serialize.WriteObject(stream, pessoa1);
stream.Position = 0;
stream.Flush();
clone = (Pessoa)serialize.ReadObject(stream);
}
clone.Companheiro.Filhos[1].Nome = "Clone do Filho 2";
Console.WriteLine($"{clone.Companheiro.Filhos[1].Nome}, {pessoa1.Companheiro.Filhos[1].Nome}, {pessoa4.Nome}");
}
}
}