gpt4 book ai didi

c# - 序列化一个对象并反序列化为对象列表

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:05 24 4
gpt4 key购买 nike

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

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

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

索恩:

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

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

最佳答案

据我所知,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 接口(interface)。这会强制您添加一个 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

关于c# - 序列化一个对象并反序列化为对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16322561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com