将流写入对象而非文件

5
我试图将流写入内存而不是文件中。我尝试了以下方法:
Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
return stream;

但是当我在写入数据后查看流时,它会显示“Length = 'stream.Length' threw an exception of type 'System.ObjectDisposedException'”。

5个回答

5
不要在获取数据之前关闭流,也不要返回流而是流的内容:
using (Stream stream = new MemoryStream()) {
  BinaryFormatter bFormatter = new BinaryFormatter();
  bFormatter.Serialize(stream, objectToSerialize);
  return stream.ToArray();
}

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()),并且还将其重置为起始位置,这通常是读取对象/数据的必要条件。


0

在使用流时,不要在完成操作之前调用stream.Close(或IDisposable.Dispose())。

您可能需要将流位置设置回开头stream.Position = 0;

确保在完成操作后处理流。using语句在这里是您的好帮手。


0

这是因为你关闭了对象:stream.Close();


0

你之所以会收到异常,是因为你调用了Close()方法。请参考MSDN:Stream类

关闭当前流并释放与当前流相关联的任何资源(例如套接字和文件句柄)。

你应该可以直接移除stream.Close();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接