Использование BinaryFormatter последовательно в C # - PullRequest
2 голосов
/ 24 января 2012

Примечание: я знаю о недостатках использования BinaryFormatter в больших файлах. Но это домашнее задание для моего друга:

(.Net Framework 4) Я создал простой класс Person, который должен быть сериализован и записан в двоичном файле.

  • Для вставки, вот как это происходит: Открыть / Создать файл, Найти конец файла, Добавить сериализованный объект Person, закрыть файл. Я не хочу сериализовать List<Person> и писать все сразу.
  • Для чтения (на основе параметра index): откройте файл, найдите позицию index (на основе длины объекта), десериализуйте объект на index, верните объект.
  • Удаление: точно так же, как чтение записи в позиции index, перейти в индексную позицию, удалить ее, сохранить файл.

Я не уверен, что использование BinaryFormatter является правильным способом сделать это. например, для вставки я видел такие примеры:

FileStream fs = new FileStream(_fileName, FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, person);
fs.Close();  

, что приводит к потере всех данных в файле, и файл будет содержать только объект person. Как я могу последовательно выполнять двоичное чтение / запись / удаление объектов в файле? Моим предположением для вставки было использование другого потока, сериализация объекта в этот поток. записать поток в байтовый массив и использовать этот байтовый массив для записи в конец моего основного файлового потока. Но я не мог придумать подходящий способ для операций вставки / удаления. Какой подход лучше использовать вместо BinaryFormatter?

Примечание: чтобы быть более понятным, он сказал мне, что учитель хочет, чтобы они вычисляли количество времени для каждой операции.
Спасибо.

1 Ответ

2 голосов
/ 24 января 2012

Ваш код правильный, за исключением первой строки:

FileStream fs = new FileStream(_fileName, FileMode.Append)

Это позволит formatter.Serialize(fs,person) добавить себя в файл.

var listFromFile = new List<Person>();    

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

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

...