XMLSerializer пишет недопустимый XML при сериализации класса (Иногда)

Моя цель состоит в том, чтобы смочь совместно использовать configration настройки среди приложений. Например, я хочу смочь использовать приложение WinForm, чтобы установить и сохранить настройки и иметь консольное приложение смочь считать те настройки и работать как запланированная задача. Подход, который я попробовал, должен создать класс SharedSettings, на который ссылаются и приложением Winform и Консольным приложением. В этом классе существуют только общедоступные свойства строки как так.

public class SharedSettings
{
    public string URL { get; set; }
    public string DestUser { get; set; }
    public string RelScript { get; set; }
}

Я использую следующее для сериализации экземпляра класса SharedSettings

SharedSettings settings = new SharedSettings();

settings.RelScript = this.txtRelScript.Text;
settings.URL = this.txtURL.Text;
settings.DestUser = this.txtDestUser.Text;

XmlSerializer dehydrator = new XmlSerializer(settings.GetType());
System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate);
dehydrator.Serialize(fs, settings); 

и это, чтобы Десериализовать его и заполнить поля в Форме

SharedSettings settings = new SharedSettings();
XmlSerializer dehydrator = new XmlSerializer(settings.GetType());
System.IO.FileStream fs = new FileStream(this.configFile, FileMode.Open);
settings = (SharedSettings)dehydrator.Deserialize(fs);

this.txtRelScript.Text = settings.RelScript;
this.txtURL.Text = settings.URL;
this.DestUser.Text = settings.DestUser;

Время от времени, возможно, один из каждых пяти раз я выполняю его XML-файл, который создается в не допустимый XML. Вот пример

<?xml version="1.0"?>
<SharedSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ProjectName>test2</ProjectName>
<URL />
<DestUser>test3</DestUser>
<RelScript>D:\Events.dll</ReleaseScript>
</SharedSettings>ttings>

Заметьте последнюю строку. ttings>, Что я делаю неправильно в Сериализации моего класса?

5
задан Austin Salonen 15 December 2009 в 19:42
поделиться

3 ответа

Похоже, при предыдущем прогоне был записан более длинный файл. Использование FileMode.OpenOrCreate в вашем коде сериализации не усекает предыдущий файл, поэтому он частично перезаписывается.

Вместо этого используйте FileMode.Create .

См. документация здесь .

17
ответ дан 18 December 2019 в 11:57
поделиться

In your code to Serialize your settings, are you calling fs.Flush() or fs.Close()?

It looks like the file isnt being "closed" properly.

For instance, it looks like the file you are opening and writing to had more data in it the you wrote this time. (Not sure if that makes sense...) And because you didn't close the file properly, the file doesn't end at the right spot.

Lets see if I can explain that better...

First time you write a file, let say you write:

"Hello World!"

And the second time you write less bytes, and don't close the File properly. So if you write "Hi Bob." you would get:

"Hi Bob.orld!"

If fs.Close() doesn't fix your problem, you can try deleteing the config file each time before you write it.

-1
ответ дан 18 December 2019 в 11:57
поделиться

Научитесь использовать , используя блоки :

    SharedSettings settings = new SharedSettings();

    settings.RelScript = this.txtRelScript.Text;
    settings.URL = this.txtURL.Text;
    settings.DestUser = this.txtDestUser.Text;

    XmlSerializer dehydrator = new XmlSerializer(settings.GetType());
    using (System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate))
    {
        dehydrator.Serialize(fs, settings);
    }

В результате вы не выполняете правильную очистку выходного потока.

-1
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

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