3

我可以使用 .Net ConfigurationManager 存储字符串,但如何存储结构化数据?

例如,我可以这样做:

conf = ConfigurationManager.OpenExeConfiguration(...)
string s = "myval";
conf.AppSettings.Settings["mykey"].Value = s;
conf.Save(ConfigurationSaveMode.Modified);

我想这样做:

class myclass {
   public string s;
   int i;
   ... more elements
};

myclass c = new myclass(); c.s = "mystring"; c.i = 1234; ...

conf.AppSettings.Settings["mykey"] = cc;
conf.Save(ConfigurationSaveMode.Modified);

如何使用 ConfigurationManager 存储和检索结构化数据?

我按照@sll 的建议实施了一个解决方案。但随后的困难是为配置创建一个新部分。这是如何完成的: 如何通过 ConfigurationManager 写入 User.Config 文件?

4

2 回答 2

2

您可以通过从类继承来创建自己的配置节类型,ConfigurationSection并使用它来保存/加载任何自定义类型信息。

MSDN:如何:使用 ConfigurationSection 创建自定义配置部分

顺便说一句,一个可能对您或其他人有帮助的建议:一件好事是使自定义配置部分类不可变(没有公共设置器),因此您可以确保在应用程序生命周期的任何阶段都不能更改配置,但是如果您决定为依赖于配置节类的代码编写单元测试,并且需要带有一些测试值的节存根,因为没有设置器,您可能会坚持设置属性值。解决方案是提供一个从您的节类继承的新类,并使用受保护的索引器在构造函数中指定值,如下所示:

public class TestSectionClass: MyConfigurationSection
{
    public TestSectionClass(string testUserName)
    {
        this["userName"] = testUserName;
    }
}
于 2013-03-13T10:43:07.540 回答
1

序列化

序列化数据的方法有很多种,因此您需要选择一种。但是 .NET 提供了适合很多情况的序列化 API,最近在处理 Web AJAX 调用时,我发现自己JavaScriptSerializer大量使用将事物转换为 JSON。但是有第三方库,例如protobuf-net等。

这里的关键是本质上将您的数据转换为字节或字符串表示形式,稍后可以将其反序列化回其原始结构,从而允许您将其存储在其间的介质中,例如配置文件或通过网络传输等等

根据@sll 的回答,.NET 还有另一个方面意味着它可以处理进出自定义配置部分的数据序列化;是否要为此目的明确指定类型是您的决定。底线是相同的,以某种方式序列化。

于 2013-03-13T10:42:57.080 回答