MemoryStream(XmlWriterによって書き込まれた)から読み取ろうとすると、 はObjectDisposedException ("Cannot access a closed Stream.")
をスローします。ストリームへのシリアル化とストリームからの読み取り
'using'ステートメントの途中でXmlWriterを閉じると、スローせずにコードを返すことができます。ここで何か怪しいです。
public static string SerializeToString(T obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (var stream = new MemoryStream())
using (var writer = XmlWriter.Create(stream))
{
serializer.Serialize(writer, obj);
writer.Flush();
// Swapping the flush for close fixes the ObjectDisposedException
//writer.Close();
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}
}
これは、Silverlightと.NET 4.5の両方で発生します。
周り読んだ後、私は直接、Jonの答えherereturn Encoding.UTF8.GetString(stream.GetBuffer(), 0, stream.Length);
ごとにメモリストリームから文字列を読むことができるしかし、最初に、私は例のコードで例外を引き起こすことが起こっているかを理解したいと思います。
非常に悪い推薦 - それに従わないでください - 常に 'IDisposable'オブジェクトを処分してください。 'MemoryStream.GetBuffer'と' MemoryStream.ToArray'は、 'MemoryStream'を' 'MemoryStream''に置くことができます。 –
解決策を投稿してください。 2つのネストされた使用を使用する場合、ベースストリームを2回廃棄する例外が発生します。 私の質問に答えた唯一の理由は、元のコードスニペットでネストされた 'using'ステートメントを使用するときに何が問題を引き起こしているのかを明らかにすることでした。 – aitee
コードが更新されました。 XmlWriterを破棄する場合でも。 MemoryStreamは、すでに閉じられているストリームに対してdisposeが呼び出されたときにスローされるので、usingに入れることはできません。 もっと良い解決策があれば、本当にありがとうございます。 ありがとう! – aitee