将XML反序列化为List -更快地首先组合成一个xml文件?

问题描述 投票:0回答:1

我有一个以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 });

这是我的合同类:

[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项目列表并反序列化呢?

c# xmlreader
1个回答
2
投票

串行化很慢。做比较,看看下面的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; }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.