В настоящее время мы используем гигантский объект конфигурации, который сериализуется в / из XML. По большей части это работало нормально, но мы обнаруживаем, что в случае сбоя питания и сбоя приложения файл можно оставить в состоянии, которое делает его невозможным для десериализации должным образом, эффективно повреждая информацию конфигурации.
Я хотел бы использовать встроенный файл app.config, но он, похоже, не поддерживает собственные классы. Например, с сериализацией XML я могу легко сериализовать универсальный list<ComplexClass>
без дополнительного кода. Это просто работает. Кажется, что при использовании app.config, вы должны предоставить массу информации и пользовательских классов, чтобы это работало. Кроме того, большинство учебных пособий по "пользовательской конфигурации" относятся к 2007 году и могут быть устаревшими, насколько мне известно. У кого-нибудь есть информация о самом последнем способе сделать это в .NET 4.0?
Кроме того, когда в приложении возникает проблема, 9/10 раз это происходит из-за неправильной конфигурации. App.config любит хранить изменяемые пользователем настройки в очень недоступном месте для пользователей, которые не знакомы со скрытыми каталогами и тому подобным. Есть ли способ иметь единственное место для хранения файла конфигурации, который пользователь может легко отправить нам по электронной почте, когда возникнет проблема?
Или все это проще, чем я помню, в первые 2,0 дня? Любые ссылки или быстрые примеры того, как легко сделать пользовательскую информацию app.config, были бы хороши.
В качестве дополнительного примера, это урезанная версия одного из типов объектов, которые я хочу сериализовать как List<Alarm>
, так как количество Alarm
s может варьироваться или быть пустым. Есть ли аналогичный способ сохранить что-то подобное в app.config?
[Serializable]
public class Alarm
{
[Serializable]
public class AlarmSetting
{
public enum AlarmVariables { Concentration, RSquared }
public enum AlarmComparisons { LessThan, GreaterThan }
[Description("Which entity is being alarmed on.")]
public AlarmVariables Variable { get; set; }
[Description("Method of comparing the entity to the setpoint.")]
public AlarmComparisons Comparator { get; set; }
[Description("Value at which to alarm.")]
public Double Setpoint { get; set; }
}
public String Name { get; set; }
public Boolean Enabled { get; set; }
public String Parameter { get; set; }
public List<AlarmSetting> AlarmSettings { get; set; }
public System.Drawing.Color RowColor { get; set; }
}