DataContractSerializer - как вывести XML в строку (в отличие от файла) - PullRequest
39 голосов
/ 13 июля 2010

У меня был быстрый вопрос по поводу анализатора данных.Может быть, это больше вопрос потока.Я нашел кусок кода, который записывает XML в файловый поток.Я в принципе не хочу файл и просто хочу вывод строки.

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

Ответы [ 5 ]

66 голосов
/ 13 июля 2010

Примерно так: поместите вывод в 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;
        }
    }
}
25 голосов
/ 06 августа 2010

Спасибо @ xr280xr за указание на мое забытое удаление StringWriter в первом наброске.

20 голосов
/ 14 марта 2013

И даже проще:

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();
}
3 голосов
/ 29 мая 2013

Я предлагаю объединить методы, заданные 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();
    }
}
1 голос
/ 13 ноября 2015

Вариант ответа @ root:

var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
    serializer.WriteObject(writer, objectToSerialize);
}

return sb.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...