我正在尝试将流写入ram而不是文件。我试过这样做:
Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
return stream;
但是当我在写完它之后查看该流时,它说“Length ='stream.Length'抛出了'System.ObjectDisposedException'类型的异常”
答案 0 :(得分:5)
在获取数据之前不要关闭流,也不要返回流,而是返回流的内容:
using (Stream stream = new MemoryStream()) {
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
return stream.ToArray();
}
答案 1 :(得分:3)
您正在呼叫stream.Close()
,这与在流上调用Dispose()
完全相同。
删除那行代码,你应该没问题。基本上,您需要在返回时将MemoryStream
保持打开状态。
另一方面,根据您要做的事情,您可能还想重置流的位置。我怀疑你会想要:
Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Position = 0;
return stream;
这与您的代码相同,但不是Dispose()
流(因为它不再调用stream.Close()
),并且还将其重置为起始位置,如果您需要,通常需要将对象/数据读回来。
答案 2 :(得分:0)
在完成流之前,请不要调用stream.Close(或IDisposable.Dispose())。
您可能需要将流位置设置为开始stream.Position = 0;
确保在完成后丢弃流。 using声明是你的朋友。
答案 3 :(得分:0)
这是因为你stream.Close();
了对象。
答案 4 :(得分:0)
您收到例外是因为您致电Close()
。来自MSDN: Stream Class
关闭当前流并释放所有资源(例如套接字) 和文件句柄)与当前流相关联。
您应该只需删除stream.Close();
即可。