0

我最近接受了一项任务,建议使用 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; }
}
4

0 回答 0