内存流关闭?

问题描述 投票:1回答:1

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

c# serialization stream
1个回答
2
投票

StreamReader获取它给定的Stream的所有权,并在它被释放时将其关闭(大多数在其构造函数中采用另一个IDisposable类型的类型将执行此操作)。

This StreamReader constructor采用布尔值表示在将StreamReader作为最后一个参数处理后是否打开流:

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

(那些其他参数是StreamReader(Stream)使用的默认值,来自the referencesource。)

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

© www.soinside.com 2019 - 2024. All rights reserved.