将 XML 反序列化为 List<Object> - 更快地合并到一个 xml 文件中?

Deserializing XML to List<Object> - faster to combine into one xml file first?

我有一个合同列表,这些合同以 xml 字符串形式出现,如下所示:

<contract>
  <CONTRACTID>CN0425-3</CONTRACTID>
  <NAME>10425 - One-Year Contract</NAME>
  <WHENMODIFIED>02/01/2020 08:18:30</WHENMODIFIED>
</contract>

<contract>
  <CONTRACTID>CN0260-4</CONTRACTID>
  <NAME>10260 - One-Year Contract</NAME>
  <WHENMODIFIED>02/01/2020 08:18:30</WHENMODIFIED>
</contract>

我正在使用此函数将每个项目反序列化为一个对象:

 public static T ParseXML<T>(this string @this) where T : class
 {
      var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Document });
      var xmlRoot = new XmlRootAttribute { ElementName = typeof(T).Name.ToLower(), IsNullable = true };
      return new XmlSerializer(typeof(T), xmlRoot).Deserialize(reader) as T;
 }

这样称呼它:

// list is of type List<XElement> which contains a list of contracts
contracts.AddRange(from object e in list select e.ToString().ParseXML<Contract>() into e
                    select new Contract { Key = e.CONTRACTID, Name = e.NAME });

这是我的合同 class:

[SerializableAttribute]
[DesignerCategoryAttribute("code")]
[XmlTypeAttribute(AnonymousType = true)]
[XmlRootAttribute(Namespace = "", IsNullable = false)]
public class Contract
{
    public string CONTRACTID { get; set; }
    public string NAME { get; set; }
    public string WHENMODIFIED { get; set; }
}

问题是当我有一个大列表(1000 多个合同)时,反序列化过程很慢,因为它必须遍历每个 xml 项。我想知道将所有 xml 项合并到一个文件中然后将整个文件反序列化为对象列表是否会优化性能。我可以像这样合并 xml 项的列表:

<contracts>
    <contract>
      <CONTRACTID>CN0425-3</CONTRACTID>
      <NAME>10425 - One-Year Contract</NAME>
      <WHENMODIFIED>02/01/2020 08:18:30</WHENMODIFIED>
    </contract>
    <contract>
      <CONTRACTID>CN0260-4</CONTRACTID>
      <NAME>10260 - One-Year Contract</NAME>
      <WHENMODIFIED>02/01/2020 08:18:30</WHENMODIFIED>
    </contract>
 </contracts>

你们知道这是否会提高性能吗?如果是这样,如何组合 xml 项的列表并反序列化它?

序列化速度很慢。进行比较,看看下面的 xml linq 是否更快:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var contracts = doc.Descendants("contract").Select(x => new Contract()
            {
                CONTRACTID = (string)x.Element("CONTRACTID"),
                NAME = (string)x.Element("NAME"),
                WHENMODIFIED = (DateTime)x.Element("WHENMODIFIED")
            });

        }
    }
    public class Contract
    {
        public string CONTRACTID { get; set; }
        public string NAME { get; set; }
        public DateTime WHENMODIFIED { get; set; }
    }
}