0

次のコードスニペットがあるとします。

try
{
    var myTxt = "";
    var serializer = new DataContractSerializer(myObject.GetType());
    var memoryStream = new MemoryStream()

    serializer.WriteObject(memoryStream, myObject);
    memoryStream.Position = 0;

    using (var reader = new StreamReader(memoryStream))
    {
        myTxt = reader.ReadToEnd();
    }
    .
    .
    .
}
catch (IOException ioEx)
{
     //log or whatever...        
     throw;
}

通常、メモリストリームの周りにusingステートメントがありますが、私の理解では、StreamReaderを破棄するとメモリストリームが閉じます。

だから問題は、上記に本当に間違っているものはありますか?

4

4 に答える 4

3

書き込み、巻き戻し、読み取りのポイントがわからないため、コードを単純化できます。

var serializer = new DataContractSerializer(facets.GetType());
using (var stream = new MemoryStream())
{
    serializer.WriteObject(stream, facets);
    string xml = Encoding.UTF8.GetString(stream.ToArray());
}
于 2012-07-30T16:16:57.270 に答える
1

どちらかを使用することをお勧めします

using (var stream = new MemoryStream(...))
using (var reader = new StreamReader(stream))
{
    myTxt = reader.ReadToEnd();
}

ここでは、ストリームとリーダーの両方が実行時に破棄されます

またはClose()手動でリーダー(ライター)とストリームの両方

于 2012-07-30T16:17:01.903 に答える
1

あなたのシナリオをテストするために、私は追加しました

memoryStream.Seek(0, SeekOrigin.Begin);

最後に、を受け取ったSystem.ObjectDisposedException場合、コードは有効のようです。

もちろんvcsjones、のコメントも有効です。

于 2012-07-30T16:17:54.863 に答える
1

とにかく管理されていないリソースを保持していないので問題ないと思いますMemoryStreamが、さらに安全にしたい場合は、次のようにすることができます。

var memoryStream = new MemoryStream()
StreamReader reader = null;
try{
    serializer.WriteObject(memoryStream, myObject);

    memoryStream.Position = 0;
    reader = new StreamReader(memoryStream)
    //...
}
finally
{
    if(reader != null)
        reader.Dispose();
    else
        memoryStream.Dispose();
}
于 2012-07-30T16:26:08.903 に答える