Press "Enter" to skip to content

Protobuf-net e objetos complexos

Depois do último artigo onde mostrei o quanto o Protobuf-net é poderoso, algumas suspeitas apareceram sobre um problema do mesmo com objetos complexos, então resolvi refazer o teste deixando mais “complexo” o objeto serializado. Sem mais vamos aos objetos que serão serializados.

[Serializable]
[DataContract]
public class Album
{
    [DataMember]
    public string Titulo { get; set; }

    [DataMember]
    public int AnoDeLancamento { get; set; }

    [DataMember]
    public List<Musica> Musicas { get; set; }

    [DataMember]
    public Banda Banda { get; set; }

    public Album()
    {
        Banda = new Banda() {Nome = Environment.TickCount.ToString()};
        Musicas = new List();
        for (int i = 0; i < 10; i++)
        {
            Musicas.Add(new Musica {Duracao = new TimeSpan(0, i, 0), Nome = i.ToString()});
        }
    }
}

[Serializable]
[DataContract]
public class Musica
{
    [DataMember]
    public string Nome { get; set; }

    [DataMember]
    public TimeSpan Duracao { get; set; }
}

[Serializable]
[DataContract]
public class Banda
{
    [DataMember]
    public string Nome { get; set; }

    [DataMember]
    public List Integrantes { get; set; }

    public Banda()
    {
        Integrantes = new List<Integrante>();
        for (int i = 0; i < 5; i++)
        {
            Integrantes.Add(new Integrante {Nome = string.Format("Integrante {0}", i)});
        }
    }
}

[Serializable]
[DataContract]
public class Integrante
{
    [DataMember]
    public string Nome { get; set; }
}

Ahhh Márcio mas esse objeto complexo não é tão complexo. Bom eu considero que está bom, caso alguém faça algum teste mais ousado por favor me envie!

Mesma execução explicada no artigo anterior, 100.000 serializações, 100.000 deserializações, e vamos aos resultados.

Além do gráfico, vou descrever os resultados, e novamente o Protobuf-net mostra que é disparado mais rápido que qualquer serializador disponível nativamente no .NET.

Protobuf-net
Serialização: 234 ms
Deserialização: 1154 ms

BinaryFormatter
Serialização: 6833 ms
Deserialização: 8019 ms

DataContractSerializer
Serialização: 1887 ms
Deserialização: 4790 ms

XmlSerializer
Serialização: 3385 ms
Deserialização: 7036 ms

Código fonte no github.

Abraços.