Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 对多个XML配置文件进行序列化/反序列化_.net_Configuration_Serialization_Xml Serialization - Fatal编程技术网

.net 对多个XML配置文件进行序列化/反序列化

.net 对多个XML配置文件进行序列化/反序列化,.net,configuration,serialization,xml-serialization,.net,Configuration,Serialization,Xml Serialization,我在.NET中有一组自定义XML配置管理类 我的应用程序中有两个配置作用域: 用户:该设置适用于该用户,无论其登录的是哪个帐户。存储在用户目录中的XML配置文件中 用户/帐户:该设置适用于登录到特定帐户的用户。存储在用户目录中特定于帐户的子目录下的XML配置文件中 这两个XML文档具有相同的结构,可以手动修改。当应用程序启动时,我从用户的配置文件中读取XML配置,从用户/帐户目录中读取XML配置。然后,我将两个XML文档合并到一个XDocument中,然后将XML反序列化到按照XDocument

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

我的应用程序中有两个配置作用域:

用户:该设置适用于该用户,无论其登录的是哪个帐户。存储在用户目录中的XML配置文件中

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

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

用户文件:

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

C:\下载
C:\上传
帐户XYZ的用户/帐户文件:

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

C:\newlocation\xyz\mystuff
合并后的结果:

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

C:\newlocation\xyz\mystuff
C:\上传
在上面的示例中,将从节中实例化具有两个属性的FileSettings对象—DownloadPath和UploadPath

我的问题是:我不知道下载路径和上传路径来自哪个配置文件(即作用域)。因此,当对象需要再次序列化时,它不知道哪些属性放在哪个文件中

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


谢谢。

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

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

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

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

[XmlType()]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src;   
  [XmlText]
  public string Text;
}
// serialize to
<DownloadPath Src="...">text</DownloadPath>
[XmlType()]
公共类下载路径
{ 
[XmlAttribute]
公共字符串Src;
[XmlText]
公共字符串文本;
}
//序列化到
文本

我更喜欢向XML添加一些属性,如下所示:

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

C:\newlocation\xyz\mystuff
C:\上传

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

这是我最初的想法。我要做的是C:\path。但我不确定一旦反序列化后如何在对象中表示它。我希望避免对象中的每个属性都有一个对应的源属性。有没有一种方法可以像在XML元素上使用属性那样,在对象形式中用源属性“装饰”每个属性?查看更新的帖子,我为src添加了注释作为属性。