2013-05-01 220 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