web-dev-qa-db-ja.com

DataContractSerializer-xmlを(ファイルではなく)文字列に出力する方法

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の出力を好みます。誰かが私を正しい方向に向けることができますか?

39
Hcabnettek

このようなもの-出力を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;
        }
    }
}
66
marc_s

最初のドラフトで忘れられていたStringWriterの処分を指摘してくれた@ xr280xrに感謝します。

/// <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();
    }
}
26
Pat

さらに簡単:

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();
}
20
root

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();
    }
}
3
Ohad Schneider

@rootの回答の変形:

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

return sb.ToString();
1
Johan Larsson