Какой самый быстрый способ конвертировать класс в XML - PullRequest
1 голос
/ 13 августа 2010

Я хотел бы знать, что является самым быстрым и простым способом преобразования довольно большого класса в XML. Класс будет иметь списки и массивы. Мне нужно преобразовать все эти данные в XML

Вот что делает мое приложение: он получит всю информацию из базы данных, используя linq to enties. Затем сохраните данные в классе. Затем я хочу преобразовать этот класс в XML. Когда данные представлены в формате XML, я отправлю XML в браузер вместе с таблицей стилей xsl для отображения пользователю. Какой самый быстрый способ сделать это.

Ответы [ 7 ]

5 голосов
/ 13 августа 2010

XmlSerializer фактически создает сборку (с XmlSerializationWriter), специально созданную для сериализации вашего класса.Вы можете посмотреть на сгенерированный код, выполнив эти шаги .

Вы платите цену только при первом обнаружении нового типа.

Так что я думаю, что вы должныдействительно использовать XmlSerializer не только для производительности, но и для удобства обслуживания.

Вы можете использовать mixin-like класс сериализатора:

public interface MXmlSerializable { } 
public static class XmlSerializable {
  public static string ToXml(this MXmlSerializable self) {     
    if (self == null) throw new ArgumentNullException();     
    var serializer = new XmlSerializer(self.GetType());     
    using (var writer = new StringWriter()) {       
      serializer.Serialize(writer, self);       
      return writer.GetStringBuilder().ToString();     
    }   
  }   
}

public class Customer : MXmlSerializable {   
  public string Name { get; set; }   
  public bool Preferred { get; set; } 
}

// ....

var customer = new Customer {    
  Name = "Guybrush Threepwood",    
  Preferred = true }; 
var xml = customer.ToXml();
2 голосов
/ 13 августа 2010

Самый быстрый способ - написать код для него самостоятельно.Это устранит любые накладные расходы, например необходимость использовать отражение для чтения свойств объекта, поскольку вы можете напрямую обращаться к свойствам.

Добавьте метод к классу, который возвращает его данные в виде XML, либо возвращаяXDocument, XML уже отформатирован как строка, или вы можете передать XmlWriter методу.

0 голосов
/ 13 августа 2010

Я написал программу, сериализовавшую один простой граф объектов в XML различными способами: 1. Использование XmlSerializer 2. Использование жестко закодированного сериализатора xml

30 000 документов: XmlSerializer занял: 0,9 сек. Жестко закодированный сериализатор занял: 0,45 сек

Я полагался на XmlWriter в обоих случаях, и это добавляет некоторые накладные расходы.

Обратите внимание, что вы можете указать Visual Studio генерировать сборку XmlSerializer во время компиляции, чтобы уменьшить сериализацию для этого первого экземпляра (в противном случае сборка создается во время выполнения).

0 голосов
/ 13 августа 2010

Это звучит как довольно запутанная установка, когда вы можете просто отобразить информацию о классе на веб-странице, используя ASP.NET MVC. Зачем делать дополнительные два шага, чтобы преобразовать его в XML, отправить его в браузер и использовать таблицу стилей XSL для отображения его пользователю? Это не имеет смысла.

0 голосов
/ 13 августа 2010

Самый быстрый метод будет зависеть от класса, потому что он будет написан от руки, чтобы использовать знания специфики этого класса способами, которые более общий подход не смог бы сделать.

Я бы, вероятно, использовал XmlTextWriter, а не прямо в TextWriter. В то время как последний допускает некоторую дальнейшую экономию, они будут минимальными по сравнению с лучшей структурой XmlTextWriter, и вы уже пожертвовали хорошим моментом с точки зрения структуры и простоты обслуживания.

Впоследствии вы всегда можете добавить в свою сверхоптимизированную реализацию XmlWriter;)

0 голосов
/ 13 августа 2010

Вы можете использовать сериализацию XML, например:

Foo foo = new Foo();
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
TextWriter writer = new StringWriter();
serializer.Serialize(writer, foo);
string xml = writer.ToString();
0 голосов
/ 13 августа 2010

Вы подразумеваете, что хотите «самый быстрый» подход, который будет развиваться быстрее всего? Или вы хотите подход, который будет иметь наибольшую скорость выполнения?

Если это первое, я рекомендую просто использовать класс .NET XmlSerializer: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

Сериализация класса в вывод XML так же проста, как:

XmlSerializer serializer = new XmlSerializer(myObject.GetType());
serializer.Serialize(Response.OutputStream, myObject);

И есть различные атрибуты, которыми вы можете украсить свой класс, чтобы управлять такими вещами, как, если отдельные свойства сериализуются как элементы или атрибуты и т. Д.

Есть хороший FAQ на http://www.devolutions.net/articles/serialization.aspx также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...