2

我有一种类型,我需要执行以下操作

  1. 压缩,序列化并写入文件。这可能会发生多次。
  2. 我应该能够重新创建此类对象的列表,即反序列化并存储在集合列表中。

我尝试了一些如下给出的解决方案,但它们很慢。需要使用 .Net 4.0 的快速解决方案。

索尔恩:

  1. 创建一个 zip 流,使用BinaryFormatter然后使用StreamWriter在文件中写入一行并关闭它。

创建列表的反向方法相同。读取一行解压缩,然后一次反序列化一个对象。

4

1 回答 1

1

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

如果您愿意与第三方库合作,您有一个选择是Protocol Buffers。据该网站称,它是谷歌在数据通信中使用的轻量级、快速序列化格式。在这个 StackOverflow 问题中也建议使用它:Fast and compact object serialization in .NET

有两个可用于 .NET 的库:

这是一个将“protobuf-net”(第一个链接)和“proto#”(第二个链接)与其他序列化技术进行比较的结果表(更多测试可在此处获得):

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-快速序列化技术

这个想法是您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-02T13:23:43.463 回答