我最近接受了一项任务,建议使用 Protobuf 序列化要写为 base64 字符串的对象。这将是 .NET 端口的 protobuf-net。存储此数据的先前方法是一系列位掩码,但已经过时,这是建议的路线。不幸的是,这种方法写出的数据对于我的目的来说太大了。
在代码中,我正在序列化的对象如下所示。我已经尝试过使用装饰过的 POCO 和 ProtoGen 生成的类。ProtoGen 生成的类实际上被序列化为优化程度较低的数据。
Obj
- Time
- List of an objects. A pair is what must be recorded.
Pair = [Key | Time]
查看输出和大小随着列表长度的增长而增长的方式,我认为一些大小来自存储有关类类型的类型信息。我试图看看如何将这些对存储在并行数组中并使用“打包”,但是我没有看到尺寸上有太大的改进。也许是 10%-15%。就目前而言,这比以前的数据存储方法大一个数量级,但是由于我们的密钥空间用完了,旧方法将无法工作。
我的问题是,除了通过在旧方法中添加更多位来简单地扩大密钥空间之外,还有没有办法优化 Protobuf 的大小,我可能会丢失?或者也许是序列化针对大小优化的相当简单的对象的替代方法?
我还没有尝试过,但从我正在阅读的内容来看,即使对当前数据进行 GZipping 也只会带来边际改进。接下来我将把它作为一个选项。
示例类:
[ProtoContract]
public class Foo : BaseOfFoo
{
[ProtoMember(1)]
public UInt32 Time { get; set; }
[ProtoMember(2)]
public List<ValuePair> KeywordValues { get; private set; }
}
[Serializable]
[ProtoContract]
public class ValuePair
{
[ProtoMember(1)]
public UInt32 Id { get; set; }
[ProtoMember(2)]
public UInt32 Time { get; set; }
}