2008-10-06 82 views
3

我有一套配置项目,我需要坚持到“人类可读”文件。这些项目是在一个层次:在.net中保留配置项目

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

每个项目可以存储在一个字典用字符串键和值。他们也可以在结构/ DTO中。

只要它是人类可读的,我不关心文件的格式。这可能是XML,也可能有更多的东西一样INI格式

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

有没有一种方法,以尽量减少锅炉板代码,我需要写来管理存储/读取配置项的金额是多少?

我应该创建数据传输对象(DTO)/结构并将其标记序列化(不会产生臃肿的XML还是人类可读?)

有没有其他的建议?

编辑:不是说软件必须以及配置。这留下了app.config。

回答

1

FileHelpers库。它有吨的东西从读取和写入了很多不同的格式 - 所有你需要做的就是你的对象与属性标记并调用保存()。有点像平面文件的ORM。

0

我一般用注册表存储配置(我知道,坏我!),但使用的System.Xml来读/写一个轻量级的XML文件并不难。事实上,我最近刚刚做了一个插件项目,该项目使用XML文档与主机通信并存储自己的持久设置。

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

2

我认为XmlSerializerNetDataContractSerializer都创建了人类可读的XML。 I prefer NetDataContractSerializer,因为它可以执行XmlSerializer不能执行的操作,但这些额外功能可能比您需要的更多。如果您已经为您的配置编写了课程,那么其中一个可能是您获得胜利的最短路径。

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

0

我在这种情况下的首选是创建一个DataSet与DataTables的配置数据以良好的关系方式排列 - 然后使用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中,所有非注释标记位于名为表配置与字段密钥 & 。非常容易搜索。

+0

能人实际上神交一个DataSet的XML序列化? – Benoit 2008-10-07 00:27:14

+0

当然,这取决于配置表结构的复杂性。我的配置加载到一个名为Config的DataTable中,并带有两个字段(键,值)。我只是使用DataSet读取它并访问设置 - 我的应用程序将其加载到文本编辑器中进行编辑。 – 2008-10-07 00:37:18

2

如果您的序列结构到JSON你会得到你的对象的简单的表示比XML。

下面是从詹姆斯Netwon国王的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

0

我会使用可序列化到XML的数据结构 - 事实上,因为我懒,我会使用ADO.NET数据集,因为它可以产生不具有简单的序列化格式想想很难。

至于让人类可读的老话:如果它只是为人类可读的(而不是人为修改的,我认为这是你在这里描述的),我想建立一个XSLT转换和使用它在我写出XML时生成HTML版本的配置数据。这可以让你对数据的视觉呈现进行细化控制,就像你可能要求的那样。