C# 像文件一样写入流,但真正写入对象
我正在尝试将流写入ram而不是文件。我试着这样做: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
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设置回startstream.position=0代码>
确保在完成后处理流。这里的语句是您的朋友。这是因为您stream.Close()代码>对象 由于调用了Close()
,您将获得异常。从
关闭当前流并释放所有资源(如套接字
和文件句柄)与当前流关联
您应该能够简单地删除stream.Close()代码> 在获取数据之前不要关闭流,不要返回流,而是返回流的内容:
using (Stream stream = new MemoryStream()) {
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
return stream.ToArray();
}