我阅读了一些文章,以了解有关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; }
}
数据集由
121317
表中的[AdventureWorks].[Sales].[SalesOrderDetail]
行填充 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
是一个糟糕的选择,因为它覆盖太多。