【问题标题】:Write to a stream as if it were a file, but really write to an object像文件一样写入流,但实际上写入对象
【发布时间】:2011-09-02 23:21:43
【问题描述】:
我正在尝试将流而不是文件写入内存。我试过这样做:
Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
return stream;
但是当我在我应该写入后查看流时,它会说“长度 = 'stream.Length' 引发了类型为 'System.ObjectDisposedException' 的异常”
【问题讨论】:
标签:
c#
stream
memorystream
【解决方案1】:
在获取数据之前不要关闭流,不返回流而是返回流的内容:
using (Stream stream = new MemoryStream()) {
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
return stream.ToArray();
}
【解决方案2】:
您正在调用stream.Close(),这与在流上调用Dispose() 完全相同。
只需删除那行代码,就可以了。基本上,您需要在返回时将MemoryStream 保持打开状态。
另外,根据您要执行的操作,您可能还需要重置流的位置。我怀疑你会想要:
Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Position = 0;
return stream;
这与您的代码相同,但不会 Dispose() 流(因为它不再调用 stream.Close()),并将其重置为开始位置,如果您想读取对象,通常需要这样做/data 退出。
【解决方案3】:
在完成流之前,不要调用 stream.Close(或 IDisposable.Dispose())。
您可能需要将流位置设置回开始stream.Position = 0;
确保在完成后处理流。 using 声明是你的朋友。
【解决方案5】:
您收到异常是因为您调用了Close()。来自MSDN: Stream Class
关闭当前流并释放所有资源(如套接字
和文件句柄)与当前流相关联。
您应该能够简单地删除stream.Close();。