C# 我序列化/反序列化的项越多,BinaryFormatter就会比XmlSerializer慢

C# 我序列化/反序列化的项越多,BinaryFormatter就会比XmlSerializer慢,c#,.net,performance,clone,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.

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

    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);
        }
    }
现在,当我克隆100个MyItem对象的列表时,BinaryFormatter解决方案(1ms)将比XmlSerializer解决方案(110ms)快得多。 但是如果列表中有100000个MyItem对象,BinaryFormatter解决方案(1s)将比XmlSerializer解决方案(450ms)慢


这是怎么回事?

二进制格式化程序可搜索所有元数据,如类型、程序集信息

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


这可能是因为binaryformatter的性能问题在以后的.net版本中得到了修复:

当BinaryFormatter遇到一个更大的对象列表时,它会变为二次型 中的线性搜索导致的反序列化时间

还有解决办法:

此修复程序计划包含在.NET Framework 4.7.2更新中。 默认情况下不会启用它。只有在以下情况下才会启用该功能: Switch.System.Runtime.Serialization.UseNewMaxArraySize配置开关 一切就绪


这对我来说完全有道理。谢谢
[Serializable]
public class MyItem
{
    public string Name { get; set; }
}