Tôi đã làm một số so sánh giữa BinaryFormatter
và Protobuf-net serializer và khá hài lòng với những gì tôi found, nhưng điều lạ là Protobuf-net quản lý để sắp xếp các đối tượng vào một mảng byte nhỏ hơn những gì tôi sẽ nhận được nếu tôi chỉ đã viết giá trị của mỗi thuộc tính vào một mảng các byte mà không có bất kỳ siêu dữ liệu nào.Protobuf-net có tích hợp nén để tuần tự hóa không?
Tôi biết Protobuf-net hỗ trợ chuỗi thực tập nếu bạn đặt AsReference
thành true
, nhưng tôi không làm điều đó trong trường hợp này, do đó Protobuf-net cung cấp một số nén theo mặc định?
Dưới đây là một số mã, bạn có thể chạy để xem cho chính mình:
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: Quên để thêm, lớp SimpleObject trông như thế này:
[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; }
}
cảm ơn, tất cả đều có ý nghĩa ngay bây giờ! – theburningmonk
Tại sao protobuf chỉ tạo 1 byte cho 128 giá trị? 8 bit cho phép viết 256 giá trị khác nhau. – tobi
@tobi nó sử dụng mã hóa "varint" cho số trường - nghĩa là tải trọng 7 bit và 1 bit "có một byte khác để đọc". Bạn tiếp tục đọc cho đến khi MSB bằng không. –