序列化一个对象和反序列化为对象
的名单上有这样一种类型,我需要做下面的序列化一个对象和反序列化为对象
- 拉链,序列化和写入文件。这可能会发生多次。
- 我应该能够重新创建这种类型的对象列表,即反序列化并存储在集合列表中。
我已经试过几个解决方案等给出以下,但他们是缓慢的。需要使用.Net 4.0的快速解决方案。
溶液:
- 创建一个ZIP流,请使用
BinaryFormatter
,然后使用StreamWriter
写入文件中的行,并关闭它。创建列表
相同的反向方式。读取一行解压缩,然后一次解除一个对象的序列化。
据我所知,BinaryFormatter + StreamWriter组合可能变得非常缓慢和臃肿,因为它将元数据添加到有关对象或文件,属性和数据类型的字节数组中。
如果您愿意与第三方库一起工作,则有一个选项是Protocol Buffers。据该网站称,它是Google在其数据通信中使用的轻量级快速序列化格式。在这个StackOverflow问题中也推荐使用:Fast and compact object serialization in .NET。
有两个库可用于.NET:
- 由Marc Gravell:https://code.google.com/p/protobuf-net/
- 乔纳森双向飞碟:https://code.google.com/p/protobuf-csharp-port/
这里是结果的比较“的表protobuf网“(第一连杆)和 ”原#“(第二连杆)到其他序列化技术(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
如果您希望有更多一点控制权,不过,(如果你只是序列化对象),然后从代码项目此链接包含序列化他们一个整洁的模式: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
声音,你这样做是正确的办法。买一台电脑。:) – 2013-05-01 17:04:08
你真的需要压缩(zip)吗?这会影响你的表现。 – 2013-05-01 17:13:45
Binaryformatter并不快。你有许多和/或大的物体,它不会像例如使用二进制程序手动编写对象。 – 2013-05-01 17:43:31