Как сериализовать в существующий файл? - PullRequest
11 голосов
/ 29 апреля 2009

Допустим, у меня есть файл, который содержит сериализованный объект от BinaryFomatter. Теперь я хочу иметь возможность сериализовать другой объект и добавить его в этот существующий файл.

Как я могу это сделать?

Ответы [ 5 ]

20 голосов
/ 05 августа 2009

Это действительно возможно. Код ниже добавляет объект.

using (var fileStream = new FileStream("C:\file.dat", FileMode.Append))
{
    var bFormatter = new BinaryFormatter();
    bFormatter.Serialize(fileStream, objectToSerialize);
}

Следующий код десериализует объекты.

var list = new List<ObjectToSerialize>();    

using (var fileStream = new FileStream("C:\file.dat", FileMode.Open))
{
    var bFormatter = new BinaryFormatter();
    while (fileStream.Position != fileStream.Length)
    {
         list.Add((ObjectToSerialize)bFormatter.Deserialize(fileStream));
    }
}

Обратите внимание, чтобы этот файл работал, он должен содержать только те же объекты.

4 голосов
/ 29 апреля 2009

Поместите ваши объекты в коллекционный объект и сериализуйте так. Если вам удастся добавить двоичное представление объекта в конец существующего файла, у вас возникнут проблемы с его чтением.

3 голосов
/ 29 апреля 2009

На самом деле, если вы просто откроете поток для записи и поместите указатель в конец потока, вы можете сериализовать другой объект, и он будет добавлен к существующему потоку.

Десериализация также будет читать мимо объекта, но не дальше.

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

2 голосов
/ 29 апреля 2009

Во-первых, если вам действительно нужно сохранить массив объектов - поместите их в контейнер и сериализуйте контейнер, как было сказано ранее.

Теперь, если вы действительно хотите хранить два сериализованных объекта в одном сцепленном файле:

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

  1. Используйте или придумайте свой собственный формат файла полу-tar, в котором вы напишите небольшой заголовок в начале (или конце) файла, который описывает содержимое файла (# 'объектов размеры).

  2. Напишите код на C #, чтобы самостоятельно определять начало и конец каждого сериализованного объекта. Я не совсем уверен, что это возможно. Здесь является неофициальной документацией формата сериализации. Он содержит заголовок, однако нет гарантии, что этот заголовок не появится в файле.

2 голосов
/ 29 апреля 2009

Как насчет этого

Десериализация содержимого вашего первого файла в объект в памяти, добавление первого объекта в коллекцию (например, List <YourObjectType>), добавление вашего нового объекта в эту коллекцию, а затем сериализация коллекции (теперь содержащей два объекта) поверх существующего файла.

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