写入流就像它是一个文件,但真正写入一个对象

时间:2011-09-02 23:21:43

标签: c# stream memorystream

我正在尝试将流写入ram而不是文件。我试过这样做:

Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
return stream;

但是当我在写完它之后查看该流时,它说“Length ='stream.Length'抛出了'System.ObjectDisposedException'类型的异常”

5 个答案:

答案 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();即可。