Не правильно сериализуется класс

220
11 апреля 2017, 07:40

Есть класс Settings

[Serializable]
public class Settings
{
    public bool UseSpecifiedAccount = false;
    public string Login = String.Empty;
    public string Password = String.Empty;
    public string ConnectionString = String.Empty;
    public bool SaveToDB = false;
    public bool SaveToCSV = false;
    public bool SaveToHTML = false;
}

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

            // Считываем настройки из файла Settings.xml
            Settings setting;
            XmlSerializer formatter = new XmlSerializer(typeof(Settings));
            using (FileStream fs = new FileStream("Settings.xml", FileMode.OpenOrCreate))
            {
                setting = (Settings)formatter.Deserialize(fs);
            }
            this.UseSpecifiedAccount.Checked = setting.UseSpecifiedAccount;
            this.Login.Text = setting.Login;
            this.Passwors.Text = setting.Password;
            this.SaveToDatabase.Checked = setting.SaveToDB;
            this.ConnectionString.Text = setting.ConnectionString;
            this.SaveToCSV.Checked = setting.SaveToCSV;
            this.SaveToHTML.Checked = setting.SaveToHTML;

По нажатию кнопки "Сохранить" данные с формы сохраняются в файл.

        //Переносим настройки с формы в сериализуемый объект
        Settings setting = new Settings()
        {
            UseSpecifiedAccount = this.UseSpecifiedAccount.Checked,
            Login = this.Login.Text,
            Password = this.Passwors.Text,
            SaveToDB = this.SaveToDatabase.Checked,
            ConnectionString = this.ConnectionString.Text,
            SaveToCSV = this.SaveToCSV.Checked,
            SaveToHTML = this.SaveToHTML.Checked
        };
        // Сохраняем настройки в файл Settings.xml
        XmlSerializer formatter = new XmlSerializer(typeof(Settings));
        using (FileStream fs = new FileStream("Settings.xml", FileMode.OpenOrCreate))
        {
            formatter.Serialize(fs, setting);
        }

Проблема в том, что иногда данные сериализуются не правильно, например, вместо </Settings> в конце файла записывает </Settings></Settings> и эти данные не могут быть десериализуемы. Это происходит если я сохраню поле пароль с каким-то текстом, а затем очищу поле и сохраню пустую строку.

Answer 1

При использовании FileMode.OpenOrCreate открывается уже существующий файл, если он есть. Старое содержимое в нём сохраняется. Отсюда и мусор, если записываемое содержимое окажется короче имеющегося.

Используйте при сохранении FileMode.Create - тогда каждый раз будет создаваться новый файл.

READ ALSO
Вызвать метод формы1 после закрытия формы2

Вызвать метод формы1 после закрытия формы2

Есть 2 формы Form1 и Form2Вторая форма открывается с первой :

243
yield с буфером

yield с буфером

Допустим, из итератора извлекается что-то тяжелое или времязатратное

245
C# DDD доступ из Infrastructure к БД

C# DDD доступ из Infrastructure к БД

Всем привет! Вот такой у меня вопросПытаюсь осознать DDD и делаю web приложения на asp

228