1

我在 .NET 中有一组自定义 XML 配置管理类。

我的应用程序中有两个配置范围:

User:无论她登录的帐户如何,该设置都适用于用户。存储在用户目录中的 XML 配置文件中。

用户/帐户:该设置适用于登录到特定帐户的用户。存储在用户目录中特定帐户子目录下的 XML 配置文件中。

这两个 XML 文档具有相同的结构,并且可以手动修改。当应用程序启动时,我从用户的配置文件中读取 XML 配置,并从 User/Account 目录中读取 XML 配置。然后我将这两个 XML 文档合并到一个 XDocument 中,然后将 XML 反序列化为在 XDocument 的部分之后建模的对象。如果存在用户/帐户级别设置,它应该覆盖用户级别设置。例子:

用户档案:

<FileSettings>
  <DownloadPath>C:\downloads</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
</FileSettings>

账户 XYZ 的用户/账户文件:

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
</FileSettings>

合并后的结果:

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
</FileSettings>

在上面的示例中,将从该部分实例化具有 2 个属性的 FileSettings 对象 - DownloadPath 和 UploadPath。

这是我的问题:我不知道 DownloadPath 和 UploadPath 来自哪个配置文件(即范围)。结果,当对象需要再次序列化时,它不知道哪些属性放在哪个文件中。

问题:在逐个属性的基础上存储“源”的最佳方法是什么,以便我可以确保将设置写入读取它的同一配置文件?

谢谢。

4

2 回答 2

2

合并后,是否可以附加每个属性的值源?

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
  <DownloadPathSrc>xyz</DownloadPathSrc>
  <DownloadPathSrc>user</DownloadPathSrc>
</FileSettings>

如果是这样,两个 src 属性可以反序列化到您的 FileSettings 对象中,在再次序列化到文件之前,您可以为每个源创建一个全新的 FileSetting 对象而不设置 *src 属性,默认情况下不会序列化空字符串通过 XmlSerializer。使用 src 属性,您可以知道要将对象序列化到哪个文件。

编辑,如果你想添加src作为元素的属性。这实际上也是我最初的想法,但是,您需要为每个属性创建类。例如 FileSetting 类中的属性 DownloadPath

[XmlType()]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src;   
  [XmlText]
  public string Text;
}
// serialize to
<DownloadPath Src="...">text</DownloadPath>
于 2009-02-23T16:28:23.243 回答
1

我希望像这样向 XML 添加一些属性:

<FileSettings>
   <DownloadPath src="Account">C:\newlocation\xyz\mystuff</DownloadPath>
   <UploadPath src="User">C:\uploads</UploadPath>
</FileSettings>

更容易实现内容的分离层。

于 2009-02-23T17:00:20.033 回答