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

Sim*_*Cat 5 c# memorystream stream

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

Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
return stream;
Run Code Online (Sandbox Code Playgroud)

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

Guf*_*ffa 5

在获取数据之前不要关闭流,也不要返回流,而是返回流的内容:

using (Stream stream = new MemoryStream()) {
  BinaryFormatter bFormatter = new BinaryFormatter();
  bFormatter.Serialize(stream, objectToSerialize);
  return stream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 3

您正在调用,这与在流上stream.Close()调用完全相同。Dispose()

只要删除那行代码就可以了。基本上,您需要MemoryStream在返回时保持打开状态。

另一方面,根据您要执行的操作,您可能还需要重置流的位置。我怀疑你会想要:

Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Position = 0;
return stream;
Run Code Online (Sandbox Code Playgroud)

这与您的代码的工作方式相同,但不影响Dispose()流(因为它不再调用stream.Close()),并且还将其重置到开始位置,如果您想读回对象/数据,这通常是必需的。