2011-12-25 56 views
1

可能重复:
Fastest serializer and deserializer with lowest memory footprint in C#?比较的序列化的方法

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

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

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

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

+0

http://stackoverflow.com/questions/626766/fastest-serializer-and-deserializer -with-lowest-memory-footprint-in-c – Matthias 2011-12-25 14:06:32

+0

这样的问题(征求意见)不适用于StackExchange格式。请询问关于_specific_编程问题(如果您不能发布代码,则可能不应在此处)。 – Oded 2011-12-25 14:07:13

+0

@MarcGravell请发表这些建议作为答案。并请详细解释分组编码和加密流。非常感谢! – 2011-12-25 16:54:47

回答

4

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

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

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

(那里是在11没有意义)