当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获取它给定的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())
)。