我理解.net的正确吗 xmlignoreattribute, ,说:

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

那:

  • 如果存在于XML文件中,则该属性将被应对?
  • 该属性不会序列化到新的XML文件?

我要问的是,我已经用一个具有更多选项的新属性替换了文件中的属性。古老的物业是一个简单的布尔属性,而新物业是枚举。我已经更改了旧属性,以便根据旧属性在添加新的属性之前的含义,将新属性的价值转换为布尔值。

这使我能够通过阅读旧属性(设置新属性)并在序列化时静静地升级新文件,并添加了新属性。

但是,我想从新的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属性在避难化过程中没有填充,并且将留下其默认值。

示例程序(用于摘要编译器):

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).

响应您的编辑: 这不仅是实施细节;确实是属性的记录行为。从评论部分 文档 (第一段):“如果您将XMlignoreAttribute应用于类的任何成员,则XMLSerialializer在序列化时会忽略该成员 或应得的 班级的实例。”(添加了强调)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top