2013-05-01 278 views
2

的名單上有這樣一種類型,我需要做下面的序列化一個對象和反序列化爲對象

  1. 拉鍊,序列化和寫入文件。這可能會發生多次。
  2. 我應該能夠重新創建這種類型的對象列表,即反序列化並存儲在集合列表中。

我已經試過幾個解決方案等給出以下,但他們是緩慢的。需要使用.Net 4.0的快速解決方案。

溶液:

  1. 創建一個ZIP流,請使用BinaryFormatter,然後使用StreamWriter寫入文件中的行,並關閉它。創建列表

相同的反向方式。讀取一行解壓縮,然後一次解除一個對象的序列化。

+2

聲音,你這樣做是正確的辦法。買一臺電腦。:) – 2013-05-01 17:04:08

+0

你真的需要壓縮(zip)嗎?這會影響你的表現。 – 2013-05-01 17:13:45

+0

Binaryformatter並不快。你有許多和/或大的物體,它不會像例如使用二進制程序手動編寫對象。 – 2013-05-01 17:43:31

回答

1

據我所知,BinaryFormatter + StreamWriter組合可能變得非常緩慢和臃腫,因爲它將元數據添加到有關對象或文件,屬性和數據類型的字節數組中。

如果您願意與第三方庫一起工作,則有一個選項是Protocol Buffers。據該網站稱,它是Google在其數據通信中使用的輕量級快速序列化格式。在這個StackOverflow問題中也推薦使用:Fast and compact object serialization in .NET

有兩個庫可用於.NET:

這裏是結果的比較「的表protobuf網「(第一連桿)和 」原#「(第二連桿)到其他序列化技術(more tests available here):

Serializer     size serialize deserialize 
------------------------------------------------------------- 
protobuf-net     3   268   1,881 
proto#      3   76   1,792 
BinaryFormatter    153  6,694  8,420 
SoapFormatter    687  28,609  55,125 
XmlSerializer    153  14,594  19,819 
DataContractSerializer  205  3,263  10,516 
DataContractJsonSerializer 26  2,854  15,621 

如果您希望有更多一點控制權,不過,(如果你只是序列化對象),然後從代碼項目此鏈接包含序列化他們一個整潔的模式:http://www.codeproject.com/Articles/14164/A-Fast-Serialization-Technique

的想法是你需要實現ISerializable接口用於你需要序列化的任何類。這迫使您添加一個ISerializable.GetObjectData方法,該方法提供SerializationWriter,您可以使用它們分別編寫每個屬性,然後將其添加到SerializationInfo對象。語法本身實際上非常簡單。

下面是從該網站GetObjectData方法的快速,簡稱,示例:

// Serialize the object. Write each field to the SerializationWriter 
// then add this to the SerializationInfo parameter 

public void GetObjectData (SerializationInfo info, StreamingContext ctxt) { 
    SerializationWriter sw = SerializationWriter.GetWriter(); 
    sw.Write (id1); 
    sw.Write (id2); 
    sw.Write (id3); 
    sw.Write (s1); 
    sw.Write (s2); 

    // more properties here   

    sw.AddToInfo (info); 
} 

下面是筆者的測試結果:

      Formatter  Size (bytes)  Time (uS) 
-------------------------------------------------------------------- 
Standard serialization Binary   2080   364 
Fast serialization  Binary   421   74 
Fast serialization  SOAP    1086   308