我正在浏览文章以了解有关 datacontractserializer 和 binaryformatter 序列化程序的更多信息。根据到目前为止所做的阅读,我的印象是 binaryformatter 的占用空间应该小于 datacontractserializer。原因是 DataContractSerializer 序列化为 xml 信息集,而 binaryformatter 序列化为专有二进制格式。
下面是测试
[Serializable]
[DataContract]
public class Packet
{
[DataMember]
public DataSet Data { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Description { get; set; }
}
DataSet 填充了 [AdventureWorks].[Sales].[SalesOrderDetail]
表中的 121317
行
using (var fs = new FileStream("test1.txt", FileMode.Create))
{
var dcs = new DataContractSerializer(typeof(Packet));
dcs.WriteObject(fs, packet);
Console.WriteLine("Total bytes with dcs = " + fs.Length);
}
using(var fs = new FileStream("test2.txt", FileMode.Create))
{
var bf = new BinaryFormatter();
bf.Serialize(fs, packet);
Console.WriteLine("Total bytes with binaryformatter = " + fs.Length);
}
Results
Total bytes with dcs = 57133023
Total bytes with binaryformatter = 57133984
问题 为什么 binaryformatter 的字节数比 datacontractserializer 多?不应该少很多吗?
最佳答案
DataSet
有一个坏习惯:它实现了 ISerializable
,然后默认将其内容序列化为 XML 字符串,即使传递给 BinaryFormatter
。这就是为什么这两个流的大小几乎相同的原因。如果您将其 RemotingFormat
属性更改为 Binary
,它会做同样的事情,但会创建一个新的 BinaryFormatter
,将自身转储到 MemoryStream
,然后将生成的字节数组作为值放入外部 BinaryFormatter
的流中。
除此之外,BinaryFormatter
包含有关类型的更多信息,例如它们来自的程序集的全名;此外,在 DataSet
的 XML 之上还有每个对象的开销。
如果您试图比较两个序列化程序的行为,DataSet
是一个糟糕的选择,因为它覆盖了太多。
关于c# - DataContractSerializer 与 BinaryFormatter 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742342/