c# - DataContractSerializer 与 BinaryFormatter 性能对比

标签 c# c#-4.0 datacontractserializer binaryformatter

我正在浏览文章以了解有关 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/

相关文章:

c# - 如何使用 EWS 检索有关启用 Exchange 邮件的公用文件夹的邮件相关信息

c# - 托管 VCL.Arrow 键和 Tab 键

java - 如何编写可以获取更新的代码?

c# - WebAPI 序列化程序序列化基类而不是笨拙的子类

c# - DataContractSerializer 将对象列表中的重复属性引用反序列化为 null

WCF 客户端在识别 ServiceKnownTypes 时遇到问题?

c# - 多线程会提高单处理器的计算速度吗

c# - ASP.NET Core - 如何检测 IHostedService 是否在运行时崩溃?我可以重新启动它吗?

c# - 在 C# 4.0 中具有持续运行线程的 Windows 服务的最佳解决方案

c# - .Net 从哪个版本开始支持 httpclient