2011-01-20 95 views
5

我正在阅读文章以了解有关datacontractserializer和binaryformatter序列化程序的更多信息。根据迄今为止所做的阅读,我的印象是binaryformatter应该比datacontractserializer的占用空间更小。原因是DataContractSerializer序列化为xml infoset,而binaryformatter序列化为专有二进制格式。DataContractSerializer vs 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的多吗?它不应该小得多吗?

回答

5

DataSet有一个坏习惯:它实现了ISerializable,然后默认将其内容序列化为一串XML,即使传递给BinaryFormatter。这就是为什么这两个流大小几乎相同。如果将RemotingFormat属性更改为Binary,它将执行相同的操作,但创建一个新的BinaryFormatter,将其自身转储到MemoryStream中,然后将得到的字节数组作为值存储在外部BinaryFormatter的流中。

除此之外,BinaryFormatter还包含更多关于类型的信息,例如它们来自的程序集全名;另外,对于DataSet,XML的顶部存在每个对象的开销。

如果您试图比较两个序列化器的行为,DataSet是一个糟糕的选择,因为它覆盖太多。

+0

感谢您的洞察力。我坚持使用DataSet。太多的问题! – stackoverflowuser 2011-01-20 18:39:25