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 回答