的名單上有這樣一種類型,我需要做下面的序列化一個對象和反序列化爲對象
- 拉鍊,序列化和寫入文件。這可能會發生多次。
- 我應該能夠重新創建這種類型的對象列表,即反序列化並存儲在集合列表中。
我已經試過幾個解決方案等給出以下,但他們是緩慢的。需要使用.Net 4.0的快速解決方案。
溶液:
- 創建一個ZIP流,請使用
BinaryFormatter
,然後使用StreamWriter
寫入文件中的行,並關閉它。創建列表
相同的反向方式。讀取一行解壓縮,然後一次解除一個對象的序列化。
的名單上有這樣一種類型,我需要做下面的序列化一個對象和反序列化爲對象
我已經試過幾個解決方案等給出以下,但他們是緩慢的。需要使用.Net 4.0的快速解決方案。
溶液:
BinaryFormatter
,然後使用StreamWriter
寫入文件中的行,並關閉它。創建列表相同的反向方式。讀取一行解壓縮,然後一次解除一個對象的序列化。
據我所知,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
聲音,你這樣做是正確的辦法。買一臺電腦。:) – 2013-05-01 17:04:08
你真的需要壓縮(zip)嗎?這會影響你的表現。 – 2013-05-01 17:13:45
Binaryformatter並不快。你有許多和/或大的物體,它不會像例如使用二進制程序手動編寫對象。 – 2013-05-01 17:43:31