Бинарная (Де) Сериализация потока объектов в 1 файл - PullRequest
5 голосов
/ 15 июля 2010

Я столкнулся со следующей проблемой. Мне нужно (де) сериализовать (двоичный) поток объектов в один файл на диске. Сериализация не является проблемой, просто откройте поток в режиме добавления и используйте метод Serialize .Net BinaryFormatter, и все готово. Проблема этого подхода заключается в том, что я не могу просто передать этот поток функции десериализации BinaryFormatter, поскольку он не является ни одним экземпляром объекта, который я сериализовал.

Существует ли общее решение этой проблемы? Все объекты, сериализованные в данный поток, относятся к одному и тому же типу, поэтому, по крайней мере, нам не нужно выяснять, что должно быть десериализовано, это само собой разумеющееся, но, похоже, мне не предлагается выход из этого.

Разъяснение на основе ответов : Ожидается, что количество отправленных объектов будет большим, и поэтому невозможно хранить их все в коллекции оберток (поскольку при сбросе на диск их все нужно загрузить в память -> добавить новые -> сбросить на диск).

  • Обычно при сериализации одного объекта вы получаете файл, который содержит:

[Объект]

  • Я создаю файл, содержащий:

[Объект] [Объект] [Объект] [Object] ... [Объект]

И мне нужно десериализовать отдельные экземпляры Объекта.

Заранее спасибо!

Ответ: Поскольку ответ упоминается в этой теме (с достаточной ясностью), но никогда не указывается явно, я подумал, что изложу его здесь:

while (fileStream.Position < fileStream.Length)
    messages.Add((Message)formatter.Deserialize(fileStream));

BinaryFormatter будет десериализовывать один объект за раз по желанию :) Возможно, вы захотите кэшировать свойство fileStream.Length, так как длина, как представляется, пересчитывается каждый раз, когда вы вызываете свойство, что замедляет процесс. Я понятия не имею, почему это не сработало в первый раз, когда я попробовал это до публикации этого вопроса, но теперь это работает безупречно.

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Попробуйте поместить ваши объекты в сериализуемую коллекцию (я считаю, что List является сериализуемым), затем (де) сериализовать , что объект

РЕДАКТИРОВАТЬ в ответ на уточнение: Я только что понял, что этот вопрос имеет тот же ответ, что и этот вопрос . Вместо того, чтобы пытаться заново придумать ответ, я бы просто взглянул на ответ Марка Гравелла или этот

0 голосов
/ 15 июля 2010

Файл является сериализацией, поэтому я думаю, что отправка вашего потока непосредственно в файл будет делать то, что вы хотите.Более конкретное объяснение вашей ситуации поможет дать более полезный ответ.(Хотелось бы ввести это как «комментарий», но кнопка комментария почему-то мне недоступна.)

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