gpt4 book ai didi

c# - DataContractSerializer 与 BinaryFormatter 性能对比

转载 作者:太空狗 更新时间:2023-10-29 23:18:34 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com