繁体   English   中英

C#XML反序列化-性能问题

[英]C# XML deserialization - performance issue

我必须在反序列化之前解析XML文档。 重用已解析的结果(通过创建读取器)是否有意义,还是没有性能差异?

var root = XDocument.Parse(message).Root;
var type = mes3.Name.LocalName;
if (type == typeOf(SomeType))
{
    var reader = root.CreateReader();
    var serializer = new XmlSerializer(typeof(SomeType));
    var someType = serializer.Deserialize(reader);
}

最好通过创建读取器来重用解析的结果,而不是直接使用字符串消息来反序列化,因为在反序列化期间不会再次解析字符串。

如果我们使用快速而肮脏的演示程序:

using System;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Xml.Linq;
using System.Diagnostics;

namespace Sample_04_03_2014_01
{
    public class Sample
    {
        public string Name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Sample s = new Sample();
            s.Name = "Hello";
            var serializer = new XmlSerializer(typeof(Sample));
            var sb = new StringBuilder();
            using (var sw = new StringWriter(sb))
            {
                serializer.Serialize(sw, s);
            }
            string serialized = sb.ToString();
            Console.WriteLine(serialized);

            var root = XDocument.Parse(serialized).Root;
            Sample someType1 = null;
            Stopwatch stopWatch1 = new Stopwatch();
            stopWatch1.Start();
            for (int i = 0; i < 100000; i++)
            {
                var serializer1 = new XmlSerializer(typeof(Sample));
                using (var reader = root.CreateReader())
                {
                    someType1 = (Sample)serializer1.Deserialize(reader);
                }
            }
            stopWatch1.Stop();
            Console.WriteLine(someType1.Name);
            Console.WriteLine(stopWatch1.Elapsed);

            Sample someType2 = null;
            Stopwatch stopWatch2 = new Stopwatch();
            stopWatch2.Start();
            for (int i = 0; i < 100000; i++)
            {
                var serializer2 = new XmlSerializer(typeof(Sample));
                using (TextReader reader = new StringReader(serialized))
                {
                    someType2 = (Sample)serializer2.Deserialize(reader);
                }
            }
            stopWatch2.Stop();
            Console.WriteLine(someType2.Name);
            Console.WriteLine(stopWatch2.Elapsed);
        }
    }
}

那么对于第一种方法(CreateReader),我们可以获得约30%的性能提升。

你好00:00:00.8825465你好00:00:01.2636450

您的代码具有以下相同的性能:

using (TextReader reader = new StringReader(message))
{
  result = serializer.Deserialize(reader);
}

通过你有额外的对象.....

我用这个

using (FileStream xmlFile = new FileStream(filePath, FileMode.Open))
{
       resultclass = (resultclasstype)serializer.Deserialize(xmlFile);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM