序列化一个对象并将deSerialize序列化为对象列表

时间:2013-05-01 16:48:24

标签: c#

我有一个类型,我需要做以下

  1. zip,序列化并写入文件。这可能会发生多次。
  2. 我应该能够重新创建此类对象的列表,即反序列化并存储在集合列表中。
  3. 我尝试了下面给出的一些解决方案,但它们很慢。需要使用.Net 4.0的快速解决方案。

    Soln:

    1. 创建一个zip流,使用BinaryFormatter,然后使用StreamWriter在文件中写一行并关闭它。
    2. 创建列表的相反方法。读取一行解压缩,然后一次反序列化一个对象。

1 个答案:

答案 0 :(得分:1)

据我所知,BinaryFormatter + StreamWriter组合可能会变得非常缓慢和臃肿,因为它会向字节数组添加有关对象或文件,属性和数据类型的元数据。

如果您愿意与第三方图书馆合作,您拥有的一个选项是Protocol Buffers。根据该网站的说法,它是Google在数据通信中使用的轻量级,快速序列化格式。在StackOverflow问题中也建议使用Fast and compact object serialization in .NET

有两个可用于.NET的库:

以下是将“protobuf-net”(第一个链接)和“proto#”(第二个链接)与其他序列化技术(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

如果您希望对它有更多的控制权,(如果您只是序列化对象),那么Code Project中的这个链接包含一个用于序列化它们的简洁模式: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