我有一个类型,我需要做以下
我尝试了下面给出的一些解决方案,但它们很慢。需要使用.Net 4.0的快速解决方案。
Soln:
BinaryFormatter
,然后使用StreamWriter
在文件中写一行并关闭它。创建列表的相反方法。读取一行解压缩,然后一次反序列化一个对象。
答案 0 :(得分:1)
据我所知,BinaryFormatter + StreamWriter组合可能会变得非常缓慢和臃肿,因为它会向字节数组添加有关对象或文件,属性和数据类型的元数据。
如果您愿意与第三方图书馆合作,您拥有的一个选项是Protocol Buffers。根据该网站的说法,它是Google在数据通信中使用的轻量级,快速序列化格式。在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