Могу ли я сериализовать XML прямо на строку вместо потока с С#?
В этом примере используется 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 через метод расширения.
Ответы
Ответ 1
Развлечения с помощью методов расширения...
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);
}
}
Ответ 2
Более или менее одно и то же решение, просто используя метод расширения:
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());
}
}
Ответ 3
Я создал этот вспомогательный метод, но я еще не тестировал его. Обновлен код за orsogufo комментарии (дважды):
private string ConvertObjectToXml(object objectToSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(objectToSerialize.GetType());
StringWriter stringWriter = new StringWriter();
xmlSerializer.Serialize(stringWriter, objectToSerialize);
return stringWriter.ToString();
}
Ответ 4
Похоже, что ни один орган не ответил на его вопрос, а это не так, нет способа генерировать XML-строку без использования объекта stream или writer.