Запись в поток, как если бы это был файл, но на самом деле запись в объект - PullRequest
5 голосов
/ 03 сентября 2011

Я пытаюсь записать поток в оперативную память вместо файла.Я попытался сделать это:

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

Но когда я смотрю на поток после того, как я предположительно записал в него, он говорит: «Длина =« поток. Длина »вызвала исключение типа« System.ObjectDisposedException »»

Ответы [ 5 ]

5 голосов
/ 03 сентября 2011

Не закрывайте поток перед получением данных и не возвращайте поток, но содержимое потока:

using (Stream stream = new MemoryStream()) {
  BinaryFormatter bFormatter = new BinaryFormatter();
  bFormatter.Serialize(stream, objectToSerialize);
  return stream.ToArray();
}
3 голосов
/ 03 сентября 2011

Вы звоните 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 голосов
/ 03 сентября 2011

Вы получаете исключение, потому что вы звоните Close(). От MSDN: поток класса

Закрывает текущий поток и освобождает любые ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком.

Вы можете просто удалить stream.Close();.

0 голосов
/ 03 сентября 2011

Это потому что вы stream.Close(); объект.

0 голосов
/ 03 сентября 2011

Не вызывайте stream.Close (или IDisposable.Dispose ()) до тех пор, пока вы не закончите с потоком.

Возможно, вам нужно вернуть позицию потока в начало stream.Position = 0;

Убедитесь, что вы утилизируете поток, когда закончите., использующий оператор , ваш друг здесь.

...