.net XmlIgnoreAttribute,仅在序列化期间使用,不在反序列化期间使用?

.net XmlIgnoreAttribute,仅在序列化期间使用,不在反序列化期间使用?,.net,xml-serialization,xmlignore,.net,Xml Serialization,Xmlignore,我对.NET的理解正确吗?它说: 指示XmlSerializer的Serialize方法不序列化公共字段或公共读/写属性值 即: 该属性将被反序列化(如果存在于XML文件中) 属性将不会序列化为新的XML文件 我询问的原因是,我已将文件中的属性替换为具有更多选项的新属性。旧属性是一个简单的布尔属性,而新属性是一个枚举。我更改了旧属性,以便它将新属性的值转换为布尔值,根据添加新属性之前旧属性的含义,get和set都已实现 这允许我通过读取旧属性(设置新属性)来静默地升级新文件,并在序列化后添加

我对.NET的理解正确吗?它说:

指示XmlSerializer的Serialize方法不序列化公共字段或公共读/写属性值

即:

  • 该属性将被反序列化(如果存在于XML文件中)
  • 属性将不会序列化为新的XML文件
我询问的原因是,我已将文件中的属性替换为具有更多选项的新属性。旧属性是一个简单的布尔属性,而新属性是一个枚举。我更改了旧属性,以便它将新属性的值转换为布尔值,根据添加新属性之前旧属性的含义,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属性,这是一个重要的新属性


编辑:经过测试,我已经验证了这两种方法似乎都符合我的要求。尽管如此,我还是要留下这个问题,因为我仍然想知道上面提到的第一个行为是否只是一个实现细节,或者文档是否可以这样理解。

如果用
XmlIgnore
标记属性,它将被忽略。当XmlSerializer构建其序列化程序集时,不考虑它。因此,XmlIgnore-d属性在反序列化期间不会填充,将保留其默认值

示例程序(用于代码段编译器):

publicstaticvoid RunSnippet()
{
XmlSerializer ser=新的XmlSerializer(typeof(Fie));
Fie f=(Fie)(序列反序列化(新StringReader(“Hello”));
WL(f.Bob==null?“null”:“某物”);
}
公共类五
{
[XmlIgnore]
公共字符串Bob{get;set;}
}
此程序的输出为
null
(如果从Fie.Bob中删除XmlIgnore,则输出为
某物


编辑以响应您的编辑:这不仅仅是一个实现细节;这确实是属性的记录行为。(第一段)的备注部分:“如果将XmlIgnoreAttribute应用于类的任何成员,则XmlSerializer在序列化或反序列化该类的实例时会忽略该成员。”(强调添加)

好的,谢谢,那么我想我的测试显示了它的功能,这是愚蠢的运气。我猜我的第二个实现就是我想要使用的实现。如果将[XmlIgnore]放在子类化/重写属性上,则该属性将被忽略,值将被序列化和反序列化。
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; }
}