C# System.Configuration优于XMLSerializer有什么好处?

C# System.Configuration优于XMLSerializer有什么好处?,c#,serialization,configuration,C#,Serialization,Configuration,当我想要保存配置时,我通常使用XMLSerializer。它易于使用和理解。最后,您只需将反序列化对象强制转换为特定类型。就这样。太好了 现在我必须学习整个系统。配置的事情,我既不知道从哪里开始,也不知道它到底做什么。只是有很多关于“节”、“映射”之类的东西。我该怎么处理?MSDN文章再一次没有解释我在做什么。做一件非常简单的事情似乎有很多不必要的开销。您是在谈论应用程序配置类中的自定义部分吗 还可以定义自己的自定义配置节处理程序,该处理程序将接受XML并将其反序列化为某个类值 如果你想得到更具

当我想要保存配置时,我通常使用XMLSerializer。它易于使用和理解。最后,您只需将反序列化对象强制转换为特定类型。就这样。太好了


现在我必须学习整个系统。配置的事情,我既不知道从哪里开始,也不知道它到底做什么。只是有很多关于“节”、“映射”之类的东西。我该怎么处理?MSDN文章再一次没有解释我在做什么。做一件非常简单的事情似乎有很多不必要的开销。

您是在谈论应用程序配置类中的自定义部分吗

还可以定义自己的自定义配置节处理程序,该处理程序将接受XML并将其反序列化为某个类值

如果你想得到更具体的答案,请提出更具体的问题

UPD 当您从ConfigurationSection派生时,要从配置文件加载,可以使用如下代码

Configuration config;
config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
var _current = (ClassSettings)config.GetSection(sectionName);
如果您使用了自定义配置节处理程序(IConfigurationSectionHandler),则可以使用如下代码加载类实例:

var database = (DatabaseSettings)ConfigurationManager.GetSection(databaseSettingsName);
不幸的是,写入配置文件要复杂得多

微软建议更新配置文件内容

或者,您可以像任何其他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();
    }
}
var config=ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
ConfigurationSection=config.Sections[sectionName];
if(节!=null)
{
var info=section.SectionInformation;
var pr=信息受保护;
国际单项体育联合会(公共关系)
info.UnprotectSection();
res=GetSettingsSection(sectionName,value);
如果(!pr)
{
信息保护部分(“DataProtectionConfigurationProvider”);
config.Save();
}
}
此外,还可以像XML一样打开配置文件,序列化设置类实例,并用新元素替换旧元素(配置部分)

不幸的是,我不能说使用MS app.config样式有很多好处。这是另一个抽象层和一些附加功能(保护/取消保护从用户或机器存储加载文件的部分,等等)

对于ASP应用程序,配置文件是组合的-maching web.config设置可以使用app web.config展开


对于小型winforms应用程序,我更喜欢使用JSON序列化配置文件-它不像MS app.config那样包含任何开销,也没有XMLSerializer问题(比如性能问题)

我已经知道了。我不明白的是:我如何保存配置文件。我如何加载配置文件。为什么我要在更简单的XMLSerializer上使用所有这些?它不起作用。OpenExeConfiguration不接受字符串。它需要一些文件映射类。使用Assembly.Location或Application.Location初始化这些类也不起作用。它是是的,文件位置为空。@user2762996我已经向您展示了部分生产代码。它表示它接受.NET 3.5和4中的字符串