【问题标题】:Serialize/deserialize to/from multiple XML config files对多个 XML 配置文件进行序列化/反序列化
【发布时间】:2009-02-23 16:16:11
【问题描述】:

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

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

用户:该设置适用于用户,无论她登录的帐户如何。存储在用户目录中的 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 来自哪个配置文件(即范围)。结果,当对象需要再次序列化时,它不知道哪些属性放在哪个文件中。

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

谢谢。

【问题讨论】:

    标签: .net configuration serialization xml-serialization


    【解决方案1】:

    合并后是否可以追加各个属性的值源?

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

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

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

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

    【讨论】:

    • 这是我最初的想法。我打算执行 C:\path。但是我不确定一旦反序列化如何在对象中表示它。我想避免对象中的每个属性都有相应的源属性。
    • 有没有办法像我们在 XML 元素上使用属性一样,用对象形式的源属性“装饰”每个属性?
    • 检查更新后的帖子,我添加了 src 的评论作为属性。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多