【问题标题】:How to use the ConfigurationManager to store structured data?如何使用 ConfigurationManager 存储结构化数据?
【发布时间】:2013-03-01 06:02:03
【问题描述】:

我可以使用 .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 的建议实施了一个解决方案。但随后的困难是为配置创建一个新部分。这是如何完成的: How to Write to a User.Config file through ConfigurationManager?

【问题讨论】:

    标签: c# .net configurationmanager


    【解决方案1】:

    Serialization.

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

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

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

    【讨论】:

    • 真的!不知道 JavaScriptSerializer 类。和你一样,我现在也经常使用 JSON。从现在开始,我会很想使用这样一个有用的类。 :-)
    【解决方案2】:

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

    MSDN:How to: Create Custom Configuration Sections Using ConfigurationSection

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

    public class TestSectionClass: MyConfigurationSection
    {
        public TestSectionClass(string testUserName)
        {
            this["userName"] = testUserName;
        }
    }
    

    【讨论】:

    • 这就是我想要的。想,也许配置管理器有某种内置的序列化......
    • 不确定序列化,我喜欢自定义配置部分的方法是能够指定默认值,具有强大的类型化解决方案,清晰易读的配置文件
    猜你喜欢
    • 2015-10-09
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多