当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发生了什么事?
答案 0 :(得分:2)
StreamReader拥有它所给定的Stream的所有权,并在处置它时将其关闭(大多数在其构造函数中采用另一个IDisposable
类型的类型都将这样做)。
This StreamReader constructor的布尔值表示在将StreamReader作为其最后一个参数后是否使流保持打开状态:
using (var reader = new StreamReader(memStream, Encoding.UTF8, true, 1024, true))
{
...
}
(其他参数是the referencesource中StreamReader(Stream)
使用的默认值。)
正如Marc Gravell在评论中正确指出的那样,我们已经说过使用UTF-8编码,但是看起来您的流是二进制的,绝对不是UTF-8文本!因此,期望这在实践中会失败。查看BitConverter.ToString(memStream.GetBuffer(), 0, memStream.Length)
(或者更简单但效率更低的BitConverter.ToString(memStream.ToArray())
)的输出可能会更有用。