DataContractSerializer与BinaryFormatter性能

sta*_*ser 5 c# datacontractserializer binaryformatter c#-4.0

我正在阅读文章,以了解有关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; }
    }
Run Code Online (Sandbox Code Playgroud)

DataSet填充了表中的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
Run Code Online (Sandbox Code Playgroud)

问题 为什么binaryformatter的字节数超过datacontractserializer?它不应该小得多吗?

Jef*_*tin 5

DataSet有一个坏习惯:它实现ISerializable,然后默认将其内容序列化为XML字符串,即使传递给BinaryFormatter.这就是两个流的大小几乎相同的原因.如果你改变它的RemotingFormat属性Binary,它将做同样的事情,但是通过创建一个新的BinaryFormatter,将自己转储到a中MemoryStream,然后将得到的字节数组作为外部BinaryFormatter流的值.

除此之外,BinaryFormatter还提供有关类型的更多信息,例如它们来自的组件的全名; 此外,在XML的基础上还有每个对象的开销DataSet.

如果您正在尝试比较两个序列化程序的行为,那么DataSet它是一个糟糕的选择,因为它会覆盖太多.