2011-12-25 95 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沒有意義)