在.net中保留配置项

时间:2008-10-06 23:41:53

标签: c# .net configuration

我有一组配置项我需要持久保存到“人类可读”的文件中。这些项目属于层次结构:

Device 1
   Name
   Channel 1
     Name
     Size
     ...
   Channel N
     Name
...
Device M
   Name
   Channel 1

这些项目中的每一项都可以存储在带有字符串Key和值的Dictionary中。它们也可以在结构/ DTO中。

我不关心文件的格式,只要它是人类可读的。它可以是XML,也可以是更像INI格式的东西

[Header]
  Key=value
  Key2=value
...

有没有办法尽量减少为管理存储/读取配置项而需要编写的样板代码量?

我应该只创建数据传输对象(DTO)/结构并将它们标记为可序列化(这会产生臃肿的XML仍然是人类可读的吗?)

还有其他建议吗?

编辑:并非软件必须编写以及读取配置。这就离开了app.config。

8 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

我认为XmlSerializerNetDataContractSerializer都可以创建人类可读的XML。 I prefer NetDataContractSerializer,因为它可以执行XmlSerializer无法做到的事情,但这些额外功能可能比您需要的更多。如果您已经为您的配置编写了类,那么这两个中的一个可能是您获得胜利的最短途径。

您还可以使用自定义ConfigSectionsConfiguration class将配置写入本地app.config文件或子配置文件。

答案 2 :(得分:2)

如果将结构序列化为JSON,则可以比XML更简单地表示对象。

以下是来自James Netwon-King的JSON.Net网站的样本:

Product product = new Product();    
product.Name = "Apple";    
product.Expiry = new DateTime(2008, 12, 28);    
product.Price = 3.99M;    
product.Sizes = new string[] { "Small", "Medium", "Large" };    

string json = JavaScriptConvert.SerializeObject(product);
//{
//  "Name": "Apple",
//  "Expiry": new Date(1230422400000),
//  "Price": 3.99,
//  "Sizes": [
//    "Small",
//    "Medium",
//    "Large"
//  ]
//}   

Product deserializedProduct = JavaScriptConvert.DeserializeObject<Product>(json);

您可以阅读他的博客并下载JSON.Net here

答案 3 :(得分:1)

我怀疑您要使用的是app.config文件,其中包含您可以使用System.Configuration namesapce加载的XML格式的设置。

此处有更多信息:http://geekswithblogs.net/akraus1/articles/64871.aspx

答案 4 :(得分:1)

请参阅FileHelpers库。它有很多用于读取和写入许多不同格式的东西 - 你要做的就是用属性标记你的对象并调用Save()。类似于平面文件的ORM。

答案 5 :(得分:0)

我通常使用注册表来存储配置(我知道,不好意思!),但是使用System.Xml读取/写入轻量级XML文件并不难。事实上,我最近刚刚完成了一个插件项目,该项目使用XML文档与其主机进行通信,并存储自己的持久设置。

还有System.Configuration命名空间,但我还没有真正处理它。

答案 6 :(得分:0)

我在这种情况下的偏好是使用DataTables创建一个DataSet,用于以良好的关系方式排列的配置数据 - 然后使用DataSet.WriteXML()将其保存到配置文件中。

然后再次加载它,你只需使用DataSet.ReadXML(),它就会回到一个很好的可查询对象中。

这是我的应用允许用户在文本编辑器窗口中编辑的示例配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--****************************************************************
 Config File: FileToExcel_test.cfg
      Author: Ron Savage
        Date: 06/20/2008

 Description: 
 File to test parsing a file into an Excel workbook.

 Modification History: 
 Date       Init Comment
 06/20/2008 RS   Created.
******************************************************************-->

<!--********************************************************************
 Global Key Definitions
********************************************************************-->
   <config key="sqlTimeout"      value="1800"/>
   <config key="emailSMTPServer" value="smtp-server.austin.rr.com"/>
   <config key="LogFile"         value="FiletoExcel_test_{yyyy}{mm}{hh}.log"/>
   <config key="MaxEntries"      value="1"/>

<!--********************************************************************
 Delimiter Configurations
********************************************************************-->
   <config key="pipe"           value="|"/>


<!--********************************************************************
 Source / Target Entries
********************************************************************-->
   <config key="source_1"  value="FILE, c:\inetpub\ftproot\filetoexcel.txt, pipe, , , , , "/>
   <config key="target_1"  value="XLS, REPLACE, c:\inetpub\ftproot\filetoexcel1.xls, , , , , , , ,c:\inetpub\ftproot\filetoexcel_template.xls, ,3"/>
   <config key="notify_1"  value="store_error, store_success"/>
</configuration>

当我将其加载到DataSet中时,所有非注释标记都位于名为配置的表中,其中包含字段&amp;的即可。很容易搜索。

答案 7 :(得分:0)

我使用的数据结构可以序列化为XML - 实际上,因为我很懒,我会使用ADO.NET DataSet,因为它有一个简单的序列化格式,你可以生成而不必认为非常困难。

至于使它具有人类可读性:如果它只是必须是人类可读的(而不是人类可修改的,我认为这就是你在这里描述的),我将构建一个XSLT转换并使用每当我写出XML时,它就会产生HTML版本的配置数据。这使您可以对可能要求的数据的可视化表示进行细粒度控制。