内存流关闭了吗?

时间:2019-02-14 10:05:23

标签: c# serialization stream

当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发生了什么事?

1 个答案:

答案 0 :(得分:2)

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

This StreamReader constructor的布尔值表示在将StreamReader作为其最后一个参数后是否使流保持打开状态:

using (var reader = new StreamReader(memStream, Encoding.UTF8, true, 1024, true))
{
    ...
}

(其他参数是the referencesourceStreamReader(Stream)使用的默认值。)

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