【问题标题】:Write to a stream as if it were a file, but really write to an object像文件一样写入流,但实际上写入对象
【发布时间】:2011-09-02 23:21:43
【问题描述】:

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

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

但是当我在我应该写入后查看流时,它会说“长度 = 'stream.Length' 引发了类型为 'System.ObjectDisposedException' 的异常”

【问题讨论】:

    标签: c# stream memorystream


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      这与您的代码相同,但不会 Dispose() 流(因为它不再调用 stream.Close()),并将其重置为开始位置,如果您想读取对象,通常需要这样做/data 退出。

      【讨论】:

        【解决方案3】:

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

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

        确保在完成后处理流。 using 声明是你的朋友。

        【讨论】:

          【解决方案4】:

          因为你stream.Close();对象。

          【讨论】:

            【解决方案5】:

            您收到异常是因为您调用了Close()。来自MSDN: Stream Class

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

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

            【讨论】:

              猜你喜欢
              • 2016-07-29
              • 1970-01-01
              • 2023-03-22
              • 2023-03-31
              • 1970-01-01
              • 2015-05-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多