【问题标题】:Serialize one object and deSerialize into a list of objects序列化一个对象并反序列化为对象列表
【发布时间】:2013-05-01 16:48:24
【问题描述】:

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

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

我尝试了一些如下所示的解决方案,但速度很慢。需要使用 .Net 4.0 的快速解决方案。

解决方案:

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

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

【问题讨论】:

  • 听起来你做对了。买一台速度更快的电脑。 :)
  • 您真的需要压缩 (zip) 吗?这会严重影响你的表现。
  • Binaryformatter 并不快。你有很多和/或大的物体,它不会像例如那样快。使用二进制写入器手动写入对象。
  • @Anders Forsgren :我的类型是一个非常复杂的类型,其中包含更多类似子类型的子列表。所以这似乎不是一个好的选择谢谢你的建议
  • @Scott Jones:我需要对它进行 GZip,因为文件大小会随着时间的推移而增长,有时甚至 GZip 版本也会达到 80 -90 MB。所以我需要做压缩

标签: c#


【解决方案1】:

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

如果您愿意与第三方库合作,您可以选择Protocol Buffers。据该网站称,它是谷歌在数据通信中使用的轻量级、快速序列化格式。在这个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2020-10-31
    • 2020-11-06
    相关资源
    最近更新 更多