Десериализация XML в список <Object>- быстрее сначала объединить в один xml файл? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть список контрактов, которые представлены в виде 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 контрактов), процесс десериализации медленный, потому что он должен go через каждый 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 элементов и десериализовать его?

1 Ответ

2 голосов
/ 11 февраля 2020

Сериализация медленная. Сделайте сравнение и посмотрите, быстрее ли 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; }
    }
}
...