@RKey_Prog

Как добавлять объекты в файл с помощью сериализации?

Сделал сериализацию в файл объектов. Вопрос в том, как добавлять новый объект в файл, где находится прошлый сериализованный объект. И как будут извлекаться объекты из файла, если, скажем, использовать FileStream, FileMode.Append. Ниже представлен код сериализации объектов.
Book book = new Book(textBox1.Text.Split(' '), textBox2.Text, textBox3.Text, Int32.Parse(textBox4.Text), dateTimePicker1.Value.ToShortDateString(), dateTimePicker2.Value.ToShortDateString());

            BinaryFormatter formatter = new BinaryFormatter();

            using (FileStream fs = new FileStream(Book.path2, FileMode.Append, FileAccess.Write))
            {
                formatter.Serialize(fs, book);
            }
  • Вопрос задан
  • 598 просмотров
Решения вопроса 1
twobomb
@twobomb
Как вариант использовать лист ваших объектов, записывать его и при добавлении, читаем, добавляем и перезаписываем. Вот накидал пример, используя лист object'ов, в принципе можете и этот пример использовать просто потом лист object'ов преобразовывайте в лист Book'ов

static void Main()
        {
            addObject(123, @"D:\out.bin");
            addObject(new StringBuilder("lalalla"), @"D:\out.bin");
            addObject(new Point(10,20), @"D:\out.bin");

            var test = getObjects(@"D:\out.bin");//[int(123),string(lalalal), Point(10,20)]
        }

        public static void addObject(object obj,string path){
            BinaryFormatter formatter = new BinaryFormatter();
            List<object> objs = new List<object>();
            if (File.Exists(path))
                using (FileStream fs = File.Open(path, FileMode.Open))
                    objs = (List<object>)formatter.Deserialize(fs);
            objs.Add(obj);
            using (FileStream fs = File.Create(path))
                formatter.Serialize(fs,objs);
        }


        public static List<object> getObjects(string path){
            BinaryFormatter formatter = new BinaryFormatter();
            List<object> objs = new List<object>();
            if (File.Exists(path))
                using (FileStream fs = File.Open(path, FileMode.Open))
                    objs = (List<object>)formatter.Deserialize(fs);
            return objs;
        }

P.S. С append'ом точно ничего не получится. C# записывает всё в своем формате, описывая типы и данные всё вместе. С append'ом только если вы придумаете свой формат и напишите методы сериализации\десериализации хотя-бы например для своего класса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Рекомендую сделать сериализации не в бинарный формат, а в Json. Так будет гораздо нагляднее - что находится в файле. Библиотека newton в помощь.
По хранению: лучше всего данные считать - изменить - перезаписать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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