ошибка при сохранении данных в XML-файл

121
23 июня 2021, 12:20

У меня есть класс

public class InfoPerson
    {
        public string FIO { set; get; }
        public string Gender { set; get; }
        public string YearOfBirth { set; get; }
        public InfoPerson(string fio, string gender, string yearOfBirth)
        {
            FIO = fio;
            Gender = gender;
            YearOfBirth = yearOfBirth;
        }      
    }

Есть DataGrid

Данные в DataGrid заполняю через DataBinding. После когда данные заполнены, мне нужно их сохранить в XML-файл по закрытию данной формы. И по открытию, чтобы данные подгружались с файла.

Пробовал такой код:

List<InfoPerson> infoPerson = new List<InfoPerson>();
        public void SaveFile()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<InfoPerson>));
            using (FileStream fs = new FileStream("infopersons.xml", FileMode.OpenOrCreate))
            {
                xmlSerializer.Serialize(fs, infoPerson);
            }
        }

Но выдает исключение.

Не могу разобраться в чем причина, кто подскажет что я делаю не так?

Вроде разобрался, такой код работает

public BindingList<InfoPerson> InfoPerson { get; set; } = new BindingList<InfoPerson>();
public void Save(string FileName)
        {
            using (var writer = new StreamWriter(FileName))
            {
                var serializer = new XmlSerializer(InfoPerson.GetType());
                serializer.Serialize(writer, InfoPerson);
                writer.Flush();
            }
        }
Answer 1

Описываем класс, что нам надо

public class Person
{
    public string Name {get;set;}
}

Пример нехитрой формы

public class MyForm : Form
{
    DataGridView gv;
    public MyForm()
    {
        gv = new DataGridView();
        var bl = new BindingList<Person>();
        bl.Add(new Person() {Name = ";flkjsdflsd"});
        gv.DataSource = bl;
        this.Controls.Add(gv);
        var bt = new Button() {Text = "Save", Left = 250};
        bt.Click+= (sender, args) => {
            using(var sw = new StreamWriter(@"D:\temp\out.xml"))
            {
                var ser = new XmlSerializer(typeof(List<Person>));
                ser.Serialize(sw, bl.ToList());
            }           
        };
        this.Controls.Add(bt);
    }
}

Запуск

new MyForm().ShowDialog();

Результат

UPD

Форма вместе со считыванием.

public class MyForm : Form
{
    DataGridView gv;
    public MyForm()
    {
        gv = new DataGridView();
        var bl = new BindingList<Person>();
        bl.Add(new Person() { Name = ";flkjsdflsd" });
        gv.DataSource = bl;
        this.Controls.Add(gv);
        var bt = new Button() { Text = "Save", Left = 250 };
        bt.Click += (sender, args) =>
        {
            using (var sw = new StreamWriter(@"D:\temp\out.xml"))
            {
                var ser = new XmlSerializer(typeof(List<Person>));
                ser.Serialize(sw, bl.ToList());
            }
        };
        this.Controls.Add(bt);

        bt = new Button() { Text = "Load", Left = 250, Top = 50 };
        bt.Click += (sender, args) =>
        {
            using (var sr = new StreamReader(@"D:\temp\out.xml"))
            {
                var ser = new XmlSerializer(typeof(List<Person>));
                var list = (List<Person>)ser.Deserialize(sr);
                bl.Clear();
                foreach (var p in list) bl.Add(p);
            }
        };
        this.Controls.Add(bt);
    }
}
READ ALSO
Десериализация полей с private set в контроллере [закрыт]

Десериализация полей с private set в контроллере [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

87
Получить строку JSON от сайта

Получить строку JSON от сайта

Хочу получить расписание с сайта https://raspdmami

309
Интервал дат как параметр в SSRS

Интервал дат как параметр в SSRS

Имеется селект для отчета на MySQLОтчет буду публиковать на SRSS

194
Загрузка файлов с поддомена php

Загрузка файлов с поддомена php

Есть панель управления которая находится на поддомене dashboardsite

95