序列化方法的比较

时间:2011-12-25 14:04:05

标签: c# .net vb.net serialization

  

可能重复:
  Fastest serializer and deserializer with lowest memory footprint in C#?

我正在使用BinaryFormatter类来序列化结构或类。 (在序列化之后,我将在保存之前加密序列化文件。(当然在反序列化之前解密它))

但我听说.Net Framework中还有其他一些序列化类。像XmlSerializer,JavaScriptSerializer,DataContractSerializer和protobuf-net。

我想知道哪一个最适合我?

序列化/反序列化所需的RAM空间较少对我来说是最重要的。速度也很重要。

2 个答案:

答案 0 :(得分:4)

如果您的目标是减少内存需求,则不要序列化然后加密:而是 - 直接序列化到加密StreamStream API被设计为链接(装饰器模式)以执行多次转换而无需过多的缓冲。同样:从解密流中反序列化;不解密然后反序列化。通过这种方式,数据在需要时即时加密/解密;除了减少内存外,它还有利于安全性 - 因为这也意味着整个数据永远不会以解密的形式存在于单个缓冲区中。有关完整示例,请参阅MSDN上的CryptoStream

一些额外的说明;如果你碰巧使用protobuf-net,有一些方法可以通过使用“分组”编码来减少任何内存缓冲;你看:子消息(包括列表)的默认值是“长度前缀” - 通常这样做的方法是缓冲内存中的数据来计算长度。然而,protobuf也支持一种使用开始/结束标记的格式,它永远不需要知道长度,因此永远不需要缓冲 - 因此整个序列可以在单个传递中直接写入输出(好吧,它仍然使用缓冲区)在内部改进IO,但它在这里汇集缓冲区,以便最大限度地重复使用)。对于子对象,这很简单:

[ProtoMember(11, DatFormat = DataFormat.Grouped)]
public Customer Customer {get;set;} // a sub-object

11

中没有任何意义

答案 1 :(得分:1)

有关效果的比较,请参阅http://code.google.com/p/protobuf-net/wiki/Performance