Как сериализоваться на существующий файл?

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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));
    }
}

Примечание: для работы файл должен содержать только те же объекты.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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