C# 像文件一样写入流,但真正写入对象

C# 像文件一样写入流,但真正写入对象,c#,stream,memorystream,C#,Stream,Memorystream,我正在尝试将流写入ram而不是文件。我试着这样做: Stream stream = new MemoryStream(); BinaryFormatter bFormatter = new BinaryFormatter(); bFormatter.Serialize(stream, objectToSerialize); stream.Close(); return stream; 但是,当我在假定写入流之后查看流时,它会说“Length='stream.Length'抛出了一个类型为'Sy

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

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

但是,当我在假定写入流之后查看流时,它会说“Length='stream.Length'抛出了一个类型为'System.ObjectDisposedException'的异常”

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

只要删除那行代码,你就会没事了。基本上,当
内存流返回时,您需要让它保持打开状态

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

Stream stream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Position = 0;
return stream;
这与代码的工作原理相同,但不会
Dispose()
流(因为它不再调用
stream.Close()
),也会将其重置为开始位置,如果您想读取对象/数据,通常需要此位置。

不要调用stream.Close(或IDisposable.Dispose())直到你处理完这条小溪

您可能需要将stream position设置回start
stream.position=0


确保在完成后处理流。这里的语句是您的朋友。

这是因为您
stream.Close()对象

由于调用了
Close()
,您将获得异常。从

关闭当前流并释放所有资源(如套接字 和文件句柄)与当前流关联


您应该能够简单地删除
stream.Close()

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

using (Stream stream = new MemoryStream()) {
  BinaryFormatter bFormatter = new BinaryFormatter();
  bFormatter.Serialize(stream, objectToSerialize);
  return stream.ToArray();
}