Более простой способ сериализации класса C # в виде текста XML - PullRequest
8 голосов
/ 15 ноября 2009

Пытаясь ответить на другой вопрос, я сериализовал объект C # в строку XML. Это было удивительно сложно; это был самый короткий фрагмент кода, который я мог придумать:

var yourList = new List<int>() { 1, 2, 3 };
var ms = new MemoryStream();
var xtw = new XmlTextWriter(ms, Encoding.UTF8);
var xs = new XmlSerializer(yourList.GetType());
xs.Serialize(xtw, yourList);
var encoding = new UTF8Encoding();
string xmlEncodedList = encoding.GetString(ms.GetBuffer());

Результат в порядке:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfInt
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <int>1</int>
    <int>2</int>
    <int>3</int>
</ArrayOfInt>

Но фрагмент сложнее, чем я думаю. Я не могу поверить, что вы должны знать о кодировании и MemoryStream для этой простой задачи.

Есть ли более короткий способ сериализации объекта в строку XML?

Ответы [ 3 ]

19 голосов
/ 15 ноября 2009

немного короче: -)

var yourList = new List<int>() { 1, 2, 3 };
using (var writer = new StringWriter())
{
    new XmlSerializer(yourList.GetType()).Serialize(writer, yourList);
    var xmlEncodedList = writer.GetStringBuilder().ToString();
}

Хотя в этом предыдущем подходе есть недостаток, на который стоит обратить внимание. Он будет генерировать заголовок utf-16, так как мы используем StringWriter , поэтому он не совсем эквивалентен вашему коду. Чтобы получить заголовок utf-8, мы должны использовать MemoryStream и XmlWriter , что является дополнительной строкой кода:

var yourList = new List<int>() { 1, 2, 3 };
using (var stream = new MemoryStream())
{
    using (var writer = XmlWriter.Create(stream))
    {
        new XmlSerializer(yourList.GetType()).Serialize(writer, yourList);
        var xmlEncodedList = Encoding.UTF8.GetString(stream.ToArray());
    }
}
0 голосов
/ 15 ноября 2009

Вам не нужно MemoryStream, просто используйте StringWriter:

var yourList = new List<int>() { 1, 2, 3 };
using (StringWriter sw = new StringWriter())
{
    var xs = new XmlSerializer(yourList.GetType());
    xs.Serialize(sw, yourList);
    string xmlEncodedList = sw.ToString();
}
0 голосов
/ 15 ноября 2009

Напишите метод расширения или класс / функцию-оболочку для инкапсуляции фрагмента.

...