使用C#在类和文件之间同步XML节点

时间:2010-06-16 18:45:40

标签: c# xml file-io xml-serialization abstraction

我正在尝试编写一个与XML文件保持同步的IXmlSerializable类。 XML文件具有以下格式:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <logging>
    <logLevel>Error</logLevel>
  </logging>
  ...potentially other sections...
</configuration>

我有一个DllConfig类用于整个XML文件,一个LoggingSection类用于表示<logging>及其内容,即<logLevel>DllConfig拥有此属性:

[XmlElement(ElementName = LOGGING_TAG_NAME,
    DataType = "LoggingSection")]
public LoggingSection Logging { get; protected set; }

我想要的是在设置属性时更新(即重写)支持XML文件。设置DllConfig时,我已Logging执行此操作。但是,如果设置Logging.LogLevel,我应该怎么做呢?这是我的意思的一个例子:

var config = new DllConfig("path_to_backing_file.xml");
config.Logging.LogLevel = LogLevel.Information; // not using Logging setter, but a
                                                // setter on LoggingSection, so how
                                                // does path_to_backing_file.xml
                                                // have its contents updated?

我目前的解决方案是拥有一个继承自SyncedLoggingSection的{​​{1}}类,并在构造函数中使用LoggingSection个实例。它声明DllConfig,在设置时,更新基类中的new LogLevel,并使用给定的LogLevel将整个DllConfig写入支持XML文件。这是一项很好的技术吗?

我认为我不能将DllConfig自行序列化到支持XML文件,因为不会写入所有内容,只会编写SyncedLoggingSection节点。然后我最终会得到一个XML文件,其中只包含<logging>部分及其更新的<logging>,而不是更新<logLevel>的整个配置文件。因此,我需要将<logLevel>的实例传递给DllConfig

似乎我想要一个事件处理程序,SyncedLoggingSection中的事件处理程序会注意到其属性(即DllConfig)中的特定属性(即LogLevel)何时被设置。这样的事情有可能吗?

1 个答案:

答案 0 :(得分:0)

由于您自己实现了IXmlSerializable,因此可以将DllConfig.Logging设为私有。然后在DllConfig上添加一个公共方法来设置LogLevel,而不是直接设置Logging.LogLevel。这将是您更改LogLevel的唯一方法。在该公共方法的实现中,您可以序列化整个DllConfig以覆盖xml。