Я проводил некоторое сравнение между 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<int> Scores { get; set; }
}