2013-03-13 21 views
3

我可以使用.Net ConfigurationManager存储字符串,但是如何存储结构化数据?如何使用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?

回答

2

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

MSDN:How to: Create Custom Configuration Sections Using ConfigurationSection

BTW,这可能是你或他人有用的一个建议是:一件好事是使自定义配置部分类immutable(没有公共setter方法),这样你可以肯定的是配置上不能改变任何阶段的应用程序生命周期,但如果你决定编写单元测试的代码依赖于配置节类,并需要部分存根与一些测试值,你可能卡住abilty设置属性值,因为没有setters。解决方案提供了一个新类,它继承自您的剖面类,并使用受保护的索引器在下面的show中指定构造函数值:

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

那就是我正在寻找的。想想,也许配置管理器有某种内置的序列化... – niteskate 2013-03-13 10:59:12

+0

不确定序列化,我喜欢自定义配置节的方法是指定默认值,有强大的解决方案,清晰和人类可读的配置文件 – sll 2013-03-13 11:03:23

1

Serialization

有很多不同的序列化数据的方法,所以你需要选择一个。但是.NET提供了一个适用于很多情况的序列化API,并且在最近使用Web AJAX调用时,我发现自己使用JavaScriptSerializer来将事情转化为JSON。但是有第三方库,如protobuf-net等。

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

根据@ sll的回答,.NET有另一个方面,它可以处理数据进出自定义配置部分的序列化;无论你是否想为此目的明确指定类型,都是你的呼叫。底线是相同的,序列化,不知何故。

+0

True!不知道JavaScriptSerializer类。像你一样,我现在也倾向于经常使用JSON。从现在起,使用这样一个有用的课程对我来说是非常诱人的。 :-) – niteskate 2013-03-13 13:04:58