C# 内存流关闭了吗?
当MemoryStream尚未到达其using语句的末尾时,它是如何关闭的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);
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()
在二进制有效负载上。。。实际上不是一个有用的操作;只要你这样做只是为了检查某个东西是否被写了:很好-但是-永远不要尝试对该字符串做任何事情:当你试图将其作为字符串读取时,它已经被不可修复地破坏了,因为它不是文本数据