Подтвердить что ты не робот

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 в этом случае. Может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 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();