3

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

设备 1
   姓名
   频道 1
     姓名
     尺寸
     ...
   频道 N
     姓名
...
设备 M
   姓名
   频道 1

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

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

[标题]
  键=值
  键2=值
...

有没有办法最小化我需要编写来管理存储/读取配置项的样板代码量?

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

还有其他建议吗?

编辑:并不是说软件必须写入读取配置。这使得 app.config 被排除在外。

4

8 回答 8

3

.NET 的 YAML

于 2008-10-06T23:44:52.757 回答
2

我认为XmlSerializerNetDataContractSerializer都创建了人类可读的 XML。 我更喜欢NetDataContractSerializer,因为它可以做 XmlSerializer 不能做的事情,但这些额外的功能可能比你需要的更多。如果您已经为您的配置编写了类,那么这两个中的一个可能是您通往胜利的最短路径。

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

于 2008-10-06T23:51:39.747 回答
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 。

于 2008-10-07T00:52:43.493 回答
1

我怀疑您将要使用的是一个 app.config 文件,其中包含 XML 格式的设置,.NET 将能够使用 System.Configuration 命名空间加载该文件。

更多信息在这里: http: //geekswithblogs.net/akraus1/articles/64871.aspx

于 2008-10-06T23:45:30.757 回答
1

请参阅FileHelpers库。它有大量的东西可以读取和写入许多不同的格式——你所要做的就是用属性标记你的对象并调用 Save()。有点像用于平面文件的 ORM。

于 2008-10-07T00:55:34.437 回答
0

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

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

于 2008-10-06T23:49:52.870 回答
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 中时,所有非注释标记都驻留在一个名为Config的表中,其中包含Key & value字段。非常容易搜索。

于 2008-10-07T00:16:43.550 回答
0

我会使用可以序列化为 XML 的数据结构 - 事实上,由于我很懒,我会使用 ADO.NET 数据集,因为它有一个简单的序列化格式,您无需费力地思考即可生成.

就使其可读性而言:如果它必须是人类可读的(而不是人类可修改的,我认为这是您在此处所描述的),我将构建一个 XSLT 转换并使用它来生成每当我写出 XML 时,配置数据的 HTML 版本。这使您可以根据您的要求对数据的视觉呈现进行细粒度的控制。

于 2008-10-07T01:21:53.543 回答