Ne protobuf-net ont de compression intégré pour la sérialisation?

Je faisais une comparaison entre BinaryFormatter et protobuf-net sérialiseur et a été très heureux avec ce que j'ai trouvé, mais ce qui était étrange, c'est que protobuf-net réussi à sérialiser les objets dans un petit tableau d'octets que ce que je voudrais faire si j'ai juste écrit la valeur de chaque propriété dans un tableau d'octets sans métadonnées.

Je sais protobuf-net prend en charge la chaîne de stage si vous définissez AsReference à true, mais je ne fais pas que dans ce cas, le fait de protobuf-net fournir certains de compression par défaut?

Voici un code que vous pouvez exécuter pour voir par vous-même:

var simpleObject = new SimpleObject
                       {
                           Id = 10,
                           Name = "Yan",
                           Address = "Planet Earth",
                           Scores = Enumerable.Range(1, 10).ToList()
                       };

using (var memStream = new MemoryStream())
{
    var binaryWriter = new BinaryWriter(memStream);
    //4 bytes for int
    binaryWriter.Write(simpleObject.Id);      
    //3 bytes + 1 more for string termination
    binaryWriter.Write(simpleObject.Name);    
    //12  bytes + 1 more for string termination
    binaryWriter.Write(simpleObject.Address); 
    //40 bytes for 10 ints
    simpleObject.Scores.ForEach(binaryWriter.Write); 

    //61 bytes, which is what I expect
    Console.WriteLine("BinaryWriter wrote [{0}] bytes",
      memStream.ToArray().Count());
}

using (var memStream = new MemoryStream())
{
    ProtoBuf.Serializer.Serialize(memStream, simpleObject);

    //41 bytes!
    Console.WriteLine("Protobuf serialize wrote [{0}] bytes",
      memStream.ToArray().Count());
}

EDIT: oublié de l'ajouter, le SimpleObject classe ressemble à ceci:

[Serializable]
[DataContract]
public class SimpleObject
{
    [DataMember(Order = 1)]
    public int Id { get; set; }

    [DataMember(Order = 2)]
    public string Name { get; set; }

    [DataMember(Order = 3)]
    public string Address { get; set; }

    [DataMember(Order = 4)]
    public List<int> Scores { get; set; }
}