gpt4 book ai didi

serialization - protobuf-net 是否具有用于序列化的内置压缩?

转载 作者:行者123 更新时间:2023-12-04 18:33:23 25 4
gpt4 key购买 nike

我在 BinaryFormatter 之间做了一些比较和 protobuf-net 序列化器,对我的内容非常满意 found ,但奇怪的是 protobuf-net 设法将对象序列化为一个更小的字节数组,而如果我只是将每个属性的值写入一个没有任何元数据的字节数组,我会得到的字节数组。

如果您设置 AsReference,我知道 protobuf-net 支持字符串实习至 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; }
}

最佳答案

不,不是的; protobuf 规范中没有指定“压缩”;然而,它(默认情况下)使用“varint encoding”——一种用于整数数据的可变长度编码,这意味着小值使用更少的空间;所以 0-127 取 1 个字节加上头。请注意,对于负数,varint 本身非常复杂,因此还支持“zigzag”编码,它允许小幅数变小(基本上,它交错正负对)。

实际上,在您的情况下 Scores您还应该查看“打包”编码,它需要 [ProtoMember(4, IsPacked = true)]或等效通过 TypeModel在 v2 中(v2 支持任一方法)。这通过写入单个 header 和组合长度来避免每个值的 header 开销。 “打包”可以与 varint/zigzag 一起使用。对于您知道值可能很大且不可预测的情况,还有固定长度编码。

另请注意:但如果您的数据包含大量文本,您可能会通过 gzip 或 deflate 额外运行它而受益;如果没有,那么 gzip 和 deflate 都可能导致它变大。

线材格式概览 is here ;理解起来不是很棘手,并且可以帮助您计划如何最好地进一步优化。

关于serialization - protobuf-net 是否具有用于序列化的内置压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com