Скажем, у меня есть файл, который содержит сериализованный объект BinaryFomatter. Теперь я хочу, чтобы иметь возможность сериализации другого объекта и APPEND этого в этом существующем файле.
Как я могу это сделать?
Скажем, у меня есть файл, который содержит сериализованный объект BinaryFomatter. Теперь я хочу, чтобы иметь возможность сериализации другого объекта и APPEND этого в этом существующем файле.
Как я могу это сделать?
Во-первых, если вам действительно нужно сохранить массив объекта - поместите его в контейнер и сериализуйте контейнер, как было сказано ранее.
Теперь, если вы действительно хотите сохранить два сериализованных объекта в одном конкатенированном файле:
Я не уверен, что это возможно "из коробки", но вы можете сделать две вещи.
Используйте или создайте свой собственный формат tar-tar, в котором вы будете писать небольшой заголовок в начале (или конце) файла, который описывает содержимое файла (# 'объектов и размеры).
Напишите код С#, чтобы самостоятельно определять начало и конец каждого сериализованного объекта. Я не совсем уверен, что это возможно. Здесь - неофициальная документация формата сериализации. Он содержит заголовок, однако нет гарантии, что этот заголовок не будет отображаться в файле.
Это действительно возможно. Код ниже добавляет объект.
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));
}
}
Примечание: для работы файл должен содержать только те же объекты.
Поместите объекты в объект коллекции и выполните сериализацию. Если вам удастся добавить двоичное представление объекта в конец существующего файла, у вас возникнут проблемы с его чтением.
На самом деле, если вы просто открываете поток для записи и позиционируете указатель в конце потока, вы можете сериализовать другой объект, и он будет добавлен к существующему потоку.
Десериализация также будет прочитана за объектом, но не далее.
Очевидно, что если вам нужен произвольный доступ к вашим объектам (десериализовать объект № 17, но не все до него), вам нужен индекс позиций, где начинается каждый объект, но если вы просто хотите прочитать все объекты из в начале, вы можете просто сериализовать их друг за другом.
Как насчет этого
Отсоедините содержимое вашего первого файла к объекту в памяти, добавьте первый объект в коллекцию (например, List <YourObjectType
> ), добавьте новый объект в эту коллекцию, а затем сериализуйте коллекцию (содержащую два объекта) поверх существующего файла.