据我了解,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