我最近接受了一项任务,建议使用Protobuf将要写出的对象序列化为base64字符串。这将是.NET端口目前的protobuf-net。存储此数据的先前方法是一系列位掩码,但已经过时了,这是建议的路径。不幸的是,从这种方法中写出的数据对我来说太大了。
在代码中,我正在序列化的对象看起来像这样。我已尝试使用装饰的POCO和ProtoGen生成的类。 ProtoGen生成的类实际上被序列化为不太优化的数据。
Obj
- Time
- List of an objects. A pair is what must be recorded.
Pair = [Key | Time]
随着列表长度的增长,查看输出和大小增长的方式我认为一些大小来自存储类类型的类型信息。我试着看看如何将这些对存储在并行数组中并使用“Packed”但是我没有看到太大的改进。也许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; }
}