BinaryFormatter变得比XmlSerializer慢,我序列化/反序列化的项目越多

时间:2013-08-14 14:02:32

标签: c# .net performance clone

我有以下扩展方法来克隆包含项目的列表:

    public static class MyExtensionMethods
    {
        public static T CloneXml<T>(this T source)
        {
            var stream = new MemoryStream();
            var xmls = new XmlSerializer(typeof(T));
            xmls.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)xmls.Deserialize(stream);
        }

        public static T CloneBinary<T>(this T source)
        {
            var formatter = new BinaryFormatter();
            var stream = new MemoryStream();
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }

对于测试,我使用以下对象:

[Serializable]
public class MyItem
{
    public string Name { get; set; }
}

现在,当我克隆100个MyItem对象的列表时,BinaryFormatter解决方案(1ms)将比我的XmlSerializer解决方案(110ms)快得多。 但是如果列表中有100000个MyItem对象,则BinaryFormatter解决方案(1s)将比XmlSerializer解决方案(450ms)慢。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

二进制格式化将类型,汇编信息等所有元数据分类。

XMLSerializer只是序列化为模式(公共字段,对象的值)。所以我认为这就是它更快的原因

http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

答案 1 :(得分:0)

这很可能是由于.format更高版本中已修复的binaryformatter的性能问题:

当BinaryFormatter遇到较大的对象列表时,它将变成二次方

中的线性搜索导致反序列化时间

https://github.com/dotnet/corefx/issues/16991

解决方法:

此修复程序计划包含在.NET Framework 4.7.2更新中。 默认情况下不会启用。仅在以下情况下启用 Switch.System.Runtime.Serialization.UseNewMaxArraySize配置开关 已设置。