我有一组配置项我需要持久保存到“人类可读”的文件中。这些项目属于层次结构:
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。
答案 0 :(得分:3)
答案 1 :(得分:2)
我认为XmlSerializer和NetDataContractSerializer都可以创建人类可读的XML。 I prefer NetDataContractSerializer,因为它可以执行XmlSerializer无法做到的事情,但这些额外功能可能比您需要的更多。如果您已经为您的配置编写了类,那么这两个中的一个可能是您获得胜利的最短途径。
您还可以使用自定义ConfigSections和Configuration 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版本的配置数据。这使您可以对可能要求的数据的可视化表示进行细粒度控制。