DataContractSerializer - как я могу вывести xml в строку (в отличие от файла)
У меня был быстрый вопрос относительно datacontractserializer. Может быть, это больше вопрос о потоке. Я нашел фрагмент кода, который пишет xml в filestream. Я в основном не хочу файл и просто нужен вывод строки.
public static string DataContractSerializeObject<T>(T objectToSerialize)
{
var fs = new FileStream("test.xml", FileMode.OpenOrCreate);
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(fs, objectToSerialize);
fs.Close();
return fs.ToString();
}
fs.ToString(), очевидно, не то, что я ищу. Какой поток или писатель и т.д. Можно использовать, чтобы вернуть правильную строку, а не создать файл? Я просмотрел XML файл, созданный, и это именно то, что я ищу. XmlSerializer написал XML немного странно, и я предпочитаю вывод DataContractSerializer в этом случае. Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
Что-то вроде этого: поставьте свой вывод в MemoryStream
, а затем прочитайте это:
public static string DataContractSerializeObject<T>(T objectToSerialize)
{
using(MemoryStream memStm = new MemoryStream())
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(memStm, objectToSerialize);
memStm.Seek(0, SeekOrigin.Begin);
using(var streamReader = new StreamReader(memStm))
{
string result = streamReader.ReadToEnd();
return result;
}
}
}
Ответ 2
Благодаря @xr280xr для указания моего забытого удаления StringWriter в первом черновике.
/// <summary>
/// Converts this instance to XML.
/// </summary>
/// <returns>XML representing this instance.</returns>
public string ToXml()
{
var serializer = new DataContractSerializer(this.GetType());
using (var output = new StringWriter())
using (var writer = new XmlTextWriter(output) { Formatting = Formatting.Indented })
{
serializer.WriteObject(writer, this);
return output.GetStringBuilder().ToString();
}
}
Ответ 3
И еще проще:
var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
serializer.WriteObject(writer, objectToSerialize);
writer.Flush();
return sb.ToString();
}
Ответ 4
Я предлагаю объединить методы, указанные Pat и marc_s:
public static string DataContractSerializeObject<T>(T objectToSerialize)
{
using (var output = new StringWriter())
using (var writer = new XmlTextWriter(output) {Formatting = Formatting.Indented})
{
new DataContractSerializer(typeof (T)).WriteObject(writer, objectToSerialize);
return output.GetStringBuilder().ToString();
}
}
Ответ 5
Вариант ответа @root:
var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
serializer.WriteObject(writer, objectToSerialize);
}
return sb.ToString();