XmlIgnoreAttribute,仅在序列化期间使用,而不是在反序列化期间使用?

时间:2010-02-28 07:52:13

标签: .net xml-serialization xmlignore

我是否正确理解.NET XmlIgnoreAttribute,其中说:

  

指示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属性,这是新的属性,很重要。

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

1 个答案:

答案 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在序列化或反序列化类的实例时会忽略该成员。 “ (重点补充)