如何在反序列化时覆盖默认集合

How to overwrite default collection on deserialization

我有一个 class 代表一堆设置:

public class Settings
{
   public Settings()
   {
       InnerSettings = new List<InnerSettings>();
       //this is the settings i want to have by default
       InnerSettings.Add(new InnerSettings());
   }
   [XmlArray]
   public List<InnerSettings> InnerSettings {get; set;}
}

现在,当我反序列化这个对象时,XML 中的 InnerSettings 被添加到在默认 Settings() 构造函数中创建的项目之上的 List .有没有一种简单的方法告诉反序列化器,我想覆盖集合,删除默认项?

XML 序列化程序不支持任何回调,并且从 XmlSerializer class 派生,您可以覆盖的方法很少。让我们看看一些(肮脏的)解决方法:

1) 更改默认构造函数(XmlSerializer 将调用的构造函数)以不包含默认项。添加第二个带有虚拟参数的构造函数并公开工厂方法:

public class Settings {
   private Settings() {
       // Called by XmlDeserializer
   }

   private Settings(int dummy) {
       // Called by factory method
       InnerSettings = new List<InnerSettings> { new InnderSettings(); }
   }

   public static Settings Create() {
       return new Settings(0);
   }
}

2) 在对象反序列化后删除项目。为此创建您自己的 XmlSerializer

public class SettingsXmlSerializer : XmlSerializer {
    protected override object Deserialize(XmlSerializationReader reader) {
        var settings = (Settings)base.Deserialize(reader);
        settings.InnerSettings.RemoveAt(0);

        return settings;
    }
}

3) 这应该是正确的方法,但对于复杂类型来说并不容易:IXmlSerializable 实施的长期工作...