Могу ли я сериализовать XML прямо в строку вместо потока с C #? - PullRequest
18 голосов
/ 16 июля 2009

В этом примере использует StringWriter для хранения сериализованных данных, затем вызов ToString() дает фактическое значение string:

Person john = new Person();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person));
StringWriter stringWriter = new StringWriter();
xmlSerializer.Serialize(stringWriter, john);
string serializedXML = stringWriter.ToString();

Есть ли более простой / чистый способ сделать это? Кажется, что все перегрузки Serialize() используют Stream или Writer.

ОБНОВЛЕНИЕ: Задал похожий вопрос о сериализации IEnumerable с помощью метода расширения .

Ответы [ 4 ]

36 голосов
/ 16 июля 2009

Веселье с методами расширения ...

var ret = john.ToXmlString()

public static class XmlTools
{
    public static string ToXmlString<T>(this T input)
    {
        using (var writer = new StringWriter())
        {
            input.ToXml(writer);
            return writer.ToString();
        }
    }
    public static void ToXml<T>(this T objectToSerialize, Stream stream)
    {
        new XmlSerializer(typeof(T)).Serialize(stream, objectToSerialize);
    }

    public static void ToXml<T>(this T objectToSerialize, StringWriter writer)
    {
        new XmlSerializer(typeof(T)).Serialize(writer, objectToSerialize);
    }
}
6 голосов
/ 16 июля 2009

Более или менее ваше же решение, просто используя метод расширения:

static class XmlExtensions {

    // serialize an object to an XML string
    public static string ToXml(this object obj) {
        // remove the default namespaces
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add(string.Empty, string.Empty);
        // serialize to string
        XmlSerializer xs = new XmlSerializer(obj.GetType());
        StringWriter sw = new StringWriter();
        xs.Serialize(sw, obj, ns);
        return sw.GetStringBuilder().ToString();
    }

}

[XmlType("Element")]
public class Element {
    [XmlAttribute("name")]
    public string name;
}

class Program {
    static void Main(string[] args) {
        Element el = new Element();
        el.name = "test";
        Console.WriteLine(el.ToXml());
    }
}
4 голосов
/ 16 июля 2009

Я создал этот вспомогательный метод, но я еще не тестировал его. Обновлен код для комментариев orsogufo (дважды):

private string ConvertObjectToXml(object objectToSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(objectToSerialize.GetType());
    StringWriter stringWriter = new StringWriter();

    xmlSerializer.Serialize(stringWriter, objectToSerialize);

    return stringWriter.ToString();
}
1 голос
/ 13 мая 2016

Похоже, что на самом деле никто не ответил на его вопрос. Нет, нет способа сгенерировать строку XML без использования объекта stream или writer.

...