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

Hca*_*tek 39 c# iostream stream xml-serialization 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();
}
Run Code Online (Sandbox Code Playgroud)

fs.ToString()显然不是我想要的.什么流或编写器等,我可以只使用返回正确的字符串而不创建文件?我确实查看了文件流创建的XML,这正是我正在寻找的.XmlSerializer编写的XML有点奇怪,在这种情况下我更喜欢DataContractSerializer的输出.谁能指出我正确的方向?

mar*_*c_s 67

像这样的东西 - 把你的输出放入一个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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来你互换了参数,应该是memStm.Seek(0,SeekOrigin.Begin); (2认同)

Pat*_*Pat 27

感谢@ 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 叠加的使用就是这么做的. (6认同)

roo*_*oot 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();
}
Run Code Online (Sandbox Code Playgroud)