DataContractSerializer - 如何将xml输出到字符串(而不是文件)

时间:2010-07-13 15:33:15

标签: c# xml-serialization stream iostream datacontractserializer

我有一个关于datacontractserializer的快速问题。也许这更像是一个流问题。我发现了一段将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 个答案:

答案 0 :(得分:65)

像这样的东西 - 把你的输出放到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;
        }
    }
}

答案 1 :(得分:25)

感谢@ 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();
    }
}

答案 2 :(得分:20)

更容易:

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 :(得分:3)

我建议合并Patmarc_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();
    }
}

答案 4 :(得分:1)

@ root的回答:

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

return sb.ToString();