gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:00 25 4
gpt4 key购买 nike

我有一个代表一堆设置的类:

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 Serializer 不支持任何回调,并且派生自 XmlSerializer 类,您可以覆盖的方法很少。让我们看看一些(肮脏的)解决方法:

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 实现的长期工作...

关于c# - 如何在反序列化时覆盖默认集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31049254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com