2009-02-23 86 views
1

我在.NET中有一组自定义的XML配置管理类。对多个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

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

<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类

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

这是我最初的想法。我打算做 C:\ path。但是我不确定如何在对象反序列化时将它表示出来。我想避免为对象中的每个属性都设置相应的源属性。 – 2009-02-23 16:36:55

1

财产DownloadPath我宁愿一些属性添加到像这样的XML:

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

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