DataContractSerializer与BinaryFormatter性能比较

6

我正在阅读文章,以更好地理解数据合同序列化器和二进制格式化器序列化器。根据目前的阅读,我的印象是二进制格式化器应该比数据合同序列化器占用更少的空间。原因是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; }
    }

[AdventureWorks].[Sales].[SalesOrderDetail]表中填充了121317行数据到DataSet中。

    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多?它不应该更少吗?

1个回答

7
DataSet有一个不好的习惯:它实现了ISerializable,并且默认情况下将其内容序列化为XML字符串,即使传递给BinaryFormatter也是如此。这就是为什么这两个流几乎相同大小的原因。如果您将其RemotingFormat属性更改为Binary,它将执行相同的操作,但是通过创建一个新的BinaryFormatter,将自身转储到MemoryStream中,然后将结果字节数组作为值放入外部BinaryFormatter的流中。
除此之外,BinaryFormatter包含有关类型的更多信息,例如它们来自的程序集的完整名称;此外,在XML之上还有每个对象的开销。
如果您试图比较这两个序列化程序的行为,则选择DataSet是一个糟糕的选择,因为它覆盖了太多内容。

谢谢您的见解。我被使用DataSet卡住了。问题太多了!! - stackoverflowuser
1
@stackoverflowuser:如果体积是一个大问题,我建议直接通过Deflater运行序列化流,我的经验非常好。 - Jeffrey Hantin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接