Поток памяти закрыт? - PullRequest
       3

Поток памяти закрыт?

0 голосов
/ 14 февраля 2019

Как закрывался MemoryStream, когда он не достиг конца своего оператора using?

MusicDataStore musicData = MusicDataStore.TestData();
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream memStream = new MemoryStream())
  {
      formatter.Serialize(memStream, musicData);

      using (StreamReader reader = new StreamReader(memStream))
      {
           memStream.Position = 0;
           Console.WriteLine(reader.ReadToEnd());
      }

      //deserialize
      memStream.Position = 0;
      MusicDataStore input = (MusicDataStore)formatter.Deserialize(memStream);

  }

Я должен иметь возможность десериализовать memStream, но он не может быть прочитан, потому что он закрыт.

Когда я попытался удалить блок StreamReader, я могу успешно десериализовать memStream.Зачем?Что происходит с memStream в блоке StreamReader?

1 Ответ

0 голосов
/ 14 февраля 2019

StreamReader становится владельцем потока, который он предоставляет, и закрывает его при удалении (большинство типов, для которых в конструкторе используется другой тип IDisposable, будут делать это).

ЭтоКонструктор StreamReader принимает логическое значение, указывающее, следует ли оставить поток открытым после того, как StreamReader расположен в качестве его последнего параметра:

using (var reader = new StreamReader(memStream, Encoding.UTF8, true, 1024, true))
{
    ...
}

(Эти другие параметры являются значениями по умолчанию, которые StreamReader(Stream) использует, начиная с источник ссылки .)

Как правильно заметил в комментариях Марк Гравелл, мы говорили, что используем кодировку UTF-8, но похоже, что ваш поток двоичный и определенно не текст UTF-8!Так что ожидайте, что это не удастся на практике.Может быть более полезно взглянуть на вывод BitConverter.ToString(memStream.GetBuffer(), 0, memStream.Length) (или проще, но менее эффективно BitConverter.ToString(memStream.ToArray())).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...