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

Понижение до торнадо 5.1.1 решит эту проблему. Как вы используете pip3

sudo pip3 uninstall tornado
sudo pip3 install tornado==5.1.1
11
задан Canavar 29 April 2009 в 18:22
поделиться

5 ответов

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

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

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

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

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

2
ответ дан 3 December 2019 в 02:41
поделиться

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

4
ответ дан 3 December 2019 в 02:41
поделиться

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

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

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

3
ответ дан 3 December 2019 в 02:41
поделиться

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

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

2
ответ дан 3 December 2019 в 02:41
поделиться

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

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

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

20
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: