当我想保存配置时,我通常使用XMLSerializer。它易于使用且易于理解。最后,您只需将反序列化的对象强制转换为某种类型。而已。完美。
现在我必须学习整个System.Configuration-thing,我也不知道从哪里开始,也不知道它到底是做什么的。很多东西都有“章节”,“映射”和诸如此类的东西。我该如何处理? MSDN文章再次没有解释我正在做什么。做一件非常简单的事情似乎有很多不必要的开销。
答案 0 :(得分:0)
您是在谈论应用程序配置类中的自定义部分吗? here it is described when derived from MS Configuration section
还可以定义自己的自定义配置节处理程序IConfigurationSectionHandler,它将获取XML并将其反序列化为某个类值
如果您想获得更具体的答案,请提出更具体的问题
UPD 要从ConfigurationSection派生时从配置文件加载,可以使用如下代码
Configuration config;
config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
var _current = (ClassSettings)config.GetSection(sectionName);
如果您使用了自定义配置节处理程序(IConfigurationSectionHandler),则可以使用以下代码加载类实例:
var database = (DatabaseSettings)ConfigurationManager.GetSection(databaseSettingsName);
遗憾的是,写入配置文件更加棘手。
MS建议this way更新配置文件内容
或者您可以像任何其他XML文档一样打开配置文件,并像其他任何XML文档一样更新它:
XmlDocument config = new XmlDocument();
string configName = Assembly.GetExecutingAssembly().Location + ".config";
config.Load(configName);
XmlNode databaseNode = config.DocumentElement.SelectSingleNode(sectionName + "/" + DatabaseName);
if (databaseNode != null)
{
databaseNode.Attributes[Database.PasswordName].Value = value.Database.PasswordEnc;
}
//another nodes changes are skipped
config.Save(configName);
但是,您可以使用Protect section方法加密配置文件中的部分:
var config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
ConfigurationSection section = config.Sections[sectionName];
if (section != null)
{
var info = section.SectionInformation;
var pr = info.IsProtected;
if (pr)
info.UnprotectSection();
res = GetSettingsSection<T>(sectionName, value);
if (!pr)
{
info.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
}
}
还可以打开像XML这样的配置文件,序列化你的设置类实例,并用新的替换旧元素(config部分)。
不幸的是,我不能说使用MS app.config样式有很多好处。这是一个更多的抽象层和一些附加功能(保护/取消保护部分从用户或机器商店加载文件等等。
对于ASP应用程序,组合配置文件 - 可以使用app web.config扩展maching web.config设置。
对于小winforms应用程序我更喜欢使用JSON序列化配置文件 - 它不包含任何开销,如MS app.config并且没有XMLSerializer问题(如性能)