序列化/反序列化到多个XML配置文件

时间:2009-02-23 16:16:11

标签: .net configuration serialization xml-serialization

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

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

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

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

这两个XML文档具有相同的结构,可以手动修改。当应用程序启动时,我从用户的配置文件中读取XML配置,从用户/帐户目录中读取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来自哪个配置文件(即范围)。因此,当对象需要再次序列化时,它不知道哪个属性进入哪个文件。

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

EDIT, 如果要添加 src 作为元素的属性。 这实际上也是我的初衷,但是,你需要为每个属性创建类。例如对于FileSetting类中的属性DownloadPath

[XmlType()]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src;   
  [XmlText]
  public string Text;
}
// serialize to
<DownloadPath Src="...">text</DownloadPath>

答案 1 :(得分:1)

我更喜欢在XML中添加一些属性:

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

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