我是否正确理解.NET XmlIgnoreAttribute,其中说:
指示XmlSerializer的Serialize方法不要序列化公共字段或公共读/写属性值。
的是:
我问的原因是我用一个带有更多选项的新属性替换了文件中的属性。旧属性是一个简单的布尔属性,新属性是枚举。我已经更改了旧属性,以便将新属性的值转换为布尔值,根据旧属性在添加新属性之前的含义,get和set都已实现。
这允许我通过读取设置新属性的旧属性来静默升级新文件,并在序列化时添加新属性。
但是,我想从新的xml文件中删除旧属性,所以我想知道如果我用[XmlIgnore]
标记它会发生什么,旧的xml文件是否仍然正确反序列化并从中读取该属性文件,还是会被完全忽略?
如果没有,以下更改是否符合我的要求?
[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
get { return false; }
set {
if (value)
ListHandling = ListHandling.All;
}
}
对于所有新对象,这将返回false,因为我已经指定了默认值,并且如果存在于旧文件中,并且设置为true,这将被忽略,这将更改ListHandling属性,这是新的属性,很重要。
编辑:经过测试,我已经确认这两种方法似乎都符合我的要求。我会留下这个问题,因为我仍然想知道上面提到的第一个行为是否只是一个实现细节,或者是否可以这样理解文档。
答案 0 :(得分:3)
如果使用XmlIgnore
标记属性,则忽略。 XmlSerializer构建其序列化程序集时不考虑它。因此,在反序列化期间不会填充XmlIgnore-d属性,并且将保留其默认值。
示例程序(用于代码段编译器):
public static void RunSnippet()
{
XmlSerializer ser = new XmlSerializer(typeof(Fie));
Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
WL(f.Bob == null ? "null" : "something");
}
public class Fie
{
[XmlIgnore]
public string Bob { get; set; }
}
此程序的输出为null
(如果从Fie.Bob中删除XmlIgnore,则输出为something
)。
编辑以响应您的修改:这不仅仅是一个实施细节;它确实是属性的记录行为。从the docs(第一段)的备注部分:“如果将XmlIgnoreAttribute应用于类的任何成员,则XmlSerializer在序列化或反序列化类的实例时会忽略该成员。 “ (重点补充)