6

我对 .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 属性,这是重要的新属性。

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

4

1 回答 1

4

如果用 标记属性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)。

Edit in response to your edit: This is not just an implementation detail; it is indeed the documented behaviour of the attribute. From the Remarks section of the docs (first paragraph): "If you apply the XmlIgnoreAttribute to any member of a class, the XmlSerializer ignores the member when serializing or deserializing an instance of the class." (emphasis added)

于 2010-02-28T08:05:23.130 回答