如何在反序列化时覆盖默认集合
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
实施的长期工作...
我有一个 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
实施的长期工作...