Есть ли в protobuf-net встроенное сжатие для сериализации?

Я проводил некоторое сравнение между BinaryFormatter и сериализатором protobuf-net и был довольно доволен тем, что я нашел , но что было странно, так это то, что protobuf-net удалось сериализовать объекты в меньший байтовый массив, чем то, что я получил бы, если бы просто записал значение каждого свойства в массив байтов без каких-либо метаданных.

Я знаю, что protobuf-net поддерживает интернирование строк, если вы установите AsReference на true , но я не делаю этого в данном случае, как и protobuf-net обеспечивать сжатие по умолчанию?

Вот код, который вы можете запустить, чтобы убедиться в этом сами:

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());
}

РЕДАКТИРОВАТЬ: забыл добавить, класс SimpleObject выглядит так:

[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 Scores { get; set; }
}

25
задан Erik Kaplun 29 July 2019 в 11:10
поделиться