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

C# 使用C在类和文件之间同步XML节点#,c#,xml,file-io,xml-serialization,abstraction,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... </configurati

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <logging>
    <logLevel>Error</logLevel>
  </logging>
  ...potentially other sections...
</configuration>
我想要的是在设置属性时更新(即重写)支持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?
我当前的解决方案是拥有一个继承自
LoggingSection
SyncedLoggingSection
类,并在构造函数中获取一个
DllConfig
实例。它声明了一个
新的日志级别
,当设置该日志级别时,更新基类中的
日志级别
,并使用给定的
DllConfig
将整个
DllConfig
写入支持XML文件。这是一种好技术吗

我认为我不能将
SyncedLoggingSection
本身序列化到支持XML文件中,因为不是所有的内容都会被写入,只有
节点。然后,我将得到一个XML文件,其中只包含更新了的
部分,而不是更新了
的整个配置文件。因此,我需要将
DllConfig
的实例传递到
SyncedLoggingSection


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

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

Sarah,您不只是在
System.Configuration
命名空间中使用标准类型有什么原因吗?@John:您是指在Visual Studio中将app.config与autologic config.settings一起使用吗?我指的是创建可在app.config或web.config中使用的自定义配置节,视情况而定。您可以使用标准机制将更改写回文件。请参阅文档中的。
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?