C# 内存流关闭了吗?

C# 内存流关闭了吗?,c#,serialization,stream,C#,Serialization,Stream,当MemoryStream尚未到达其using语句的末尾时,它是如何关闭的 MusicDataStore musicData = MusicDataStore.TestData(); BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream memStream = new MemoryStream()) { formatter.Serialize(memStream, musicData);

当MemoryStream尚未到达其using语句的末尾时,它是如何关闭的

MusicDataStore musicData = MusicDataStore.TestData();
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream memStream = new MemoryStream())
  {
      formatter.Serialize(memStream, musicData);

      using (StreamReader reader = new StreamReader(memStream))
      {
           memStream.Position = 0;
           Console.WriteLine(reader.ReadToEnd());
      }

      //deserialize
      memStream.Position = 0;
      MusicDataStore input = (MusicDataStore)formatter.Deserialize(memStream);

  }
我应该能够反序列化memStream,但它无法读取,因为它已关闭


当我尝试删除StreamReader块时,我可以成功地反序列化memStream。为什么?StreamReader块中的memStream发生了什么事?

StreamReader拥有给定流的所有权,并在释放流时将其关闭(大多数在其构造函数中采用另一个
IDisposable
类型的类型都会这样做)

接受一个布尔值,表示在StreamReader被释放后是否将流保持打开状态作为其最后一个参数:

using (var reader = new StreamReader(memStream, Encoding.UTF8, true, 1024, true))
{
    ...
}
(这些其他参数是
StreamReader(Stream)
从中使用的默认值。)


正如Marc Gravell在评论中正确指出的那样,我们说过要使用UTF-8编码,但看起来您的流是二进制的,绝对不是UTF-8文本!因此,预计这将在实践中失败。查看
BitConverter.ToString(memStream.GetBuffer(),0,memStream.Length)
(或者更简单但效率更低的
BitConverter.ToString(memStream.ToArray())
)的输出可能更有用。

旁注:除非您非常小心,否则对大多数人来说,使用
二进制格式化程序通常不是一个好的选择。我经常从事序列化工作(说真的,很多)-我看到人们被
BinaryFormatter
烧掉的次数是。。。太多了如果您能够选择不同的序列化工具,我强烈建议您这样做。也很乐意提供选项建议。其他附加:
StreamReader
ReadToEnd()
在二进制有效负载上。。。实际上不是一个有用的操作;只要你这样做只是为了检查某个东西是否被写了:很好-但是-永远不要尝试对该
字符串做任何事情:当你试图将其作为
字符串读取时,它已经被不可修复地破坏了,因为它不是文本数据