Десериализация. При выводе информации из файла выводится только первая запись

272
26 июля 2022, 12:10

Цель: ввести информацию о студентах => записать в файл => вывести из файла(в консоль).

Никаких ошибок не происходит, но работает не совсем так как мне надо. Когда запускается функция вывода записей, в консоль выводится только первая добавленная в файл запись.

Подскажите, что я делаю не так...

Добавление записи в файл:

        public static void AddString()
        {
            Console.Clear();
            string path = "info.dat";
            bool exit = true;
            while (exit)
            {
                    Console.Clear();
                    Console.WriteLine("\n\tВведите данные студента:");
                    Console.WriteLine("\nФ.И.О: ");
                    string name = Console.ReadLine();
                    Console.WriteLine("\nКурс: ");
                    int course = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("\nГруппа: ");
                    string group = Console.ReadLine();
                    Console.WriteLine("\nНомер зачётки: ");
                    int id = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("\nСредний балл: ");
                    float avg = (float)Convert.ToDouble(Console.ReadLine());
                    Console.Clear();
                    Student student = new Student(name, course, group, id, avg);
                    Student[] students = new Student[] { student };
                    BinaryFormatter formatter = new BinaryFormatter();
                    using (FileStream stream = new FileStream(path, FileMode.Append))
                    {
                        formatter.Serialize(stream, students);
                        Console.WriteLine("\nУспешно добавлен.");
                    }
                    Console.WriteLine("\n\nХотите добавить ещё одного студента?\n\n1)Да\n2)Нет\n");
                    int choice = Convert.ToInt32(Console.ReadLine());
                    switch (choice)
                    {
                        case 1:
                            Console.WriteLine("OK.");
                            break;
                        case 2:
                            exit = false;
                            break;
                        default:
                            Console.Clear();
                            Console.WriteLine("\n\tОшибка ввода!");
                            Console.WriteLine("\tПопробуйте снова.\n\tНажмите 'Ввод' для продолжения...\n\t");
                            Console.ReadKey();
                            break;
                    }
            }
        }

Вывод всех записей из файла:

public static void StudentList()
        {
            string path = "info.dat";
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream stream = new FileStream(path, FileMode.Open))
            {
                Console.Clear();
                Student[] students = (Student[])formatter.Deserialize(stream);
                Console.WriteLine("Список студентов:");
                foreach (Student student in students)
                {
                    Console.WriteLine($"\nИмя: {student.Name} \nКурс: {student.Course} \nГруппа: {student.Group} \nНомер зачётки: {student.Id} \nСредний балл: {student.AvgMark}");
                }
            }
            Console.ReadKey();
        }
Answer 1

Я был не прав, BinaryFormatter поддерживает дописывание(ответ ниже), НО только по одному объекту, а не массивом объектов. Но более предпочтительна иная стратегия, что бы не обращаться каждый раз к файлу данных:

  • вычитываем все данные из файла в коллекцию объектов;
  • работаем только над этой коллекцией(добавляете, удаляете, изменяем);
  • после окончания редактирования разом все перезаписываем;
Answer 2

Покажу пример, как можно дописывать записи в файл с помощью BinaryFormatter и читать их потом в цикле. Отмечу, что прочитать их сразу все как массив будет уже невозможно.

[Serializable]
public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}
var student1 = new Student { Id = 1, Name = "one" };
var student2 = new Student { Id = 2, Name = "two" };
var bf = new BinaryFormatter();
// Пишем в новый файл
using (var fileStream = new FileStream("test.bin", FileMode.Create))
    bf.Serialize(fileStream, student1);
// Дописываем
using (var fileStream = new FileStream("test.bin", FileMode.Append))
    bf.Serialize(fileStream, student2);
// Читаем записи по одной в цикле
using (var fileStream = new FileStream("test.bin", FileMode.Open))
{
    while (fileStream.Position < fileStream.Length)
    {
        var student = (Student)bf.Deserialize(fileStream);
        Console.WriteLine(student.Id + " " + student.Name);
    }
}
READ ALSO
Xamarin редактор: что-то пошло не так

Xamarin редактор: что-то пошло не так

Прикрепляю скриншот, так как текст ошибки не копируется

404
Не происходит запись в БД

Не происходит запись в БД

Есть кнопки категорий, которые выводятся циклом foreach и соответственно таких кнопок несколько:

347
post массив input&#39;ов и multiple

post массив input'ов и multiple

На странице есть какие-то статические поля и динамически добавляется таблица с инпутами к примеру такая:

391
Почему обнуляются значения часов, минут и секунд у обеих переменных?

Почему обнуляются значения часов, минут и секунд у обеих переменных?

Почему после выполнения строки startTimesetHours(0,0,0); обнуляются значения у currentTime?

272