我有一种类型,我需要执行以下操作
- 压缩,序列化并写入文件。这可能会发生多次。
- 我应该能够重新创建此类对象的列表,即反序列化并存储在集合列表中。
我尝试了一些如下给出的解决方案,但它们很慢。需要使用 .Net 4.0 的快速解决方案。
索尔恩:
- 创建一个 zip 流,使用
BinaryFormatter
然后使用StreamWriter
在文件中写入一行并关闭它。
创建列表的反向方法相同。读取一行解压缩,然后一次反序列化一个对象。
我有一种类型,我需要执行以下操作
我尝试了一些如下给出的解决方案,但它们很慢。需要使用 .Net 4.0 的快速解决方案。
索尔恩:
BinaryFormatter
然后使用StreamWriter
在文件中写入一行并关闭它。创建列表的反向方法相同。读取一行解压缩,然后一次反序列化一个对象。
据我了解,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