【问题标题】:XmlIgnoreAttribute, only used during serialization, not during deserialization?XmlIgnoreAttribute,只在序列化时使用,反序列化时不使用?
【发布时间】:2011-01-21 23:15:18
【问题描述】:

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

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

【问题讨论】:

    标签: .net xml-serialization xmlignore


    【解决方案1】:

    如果您用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 在序列化 或反序列化 类的实例时会忽略该成员。” (强调)

    【讨论】:

    • 好的,谢谢,那么我想我的测试显示它做了什么是愚蠢的。猜猜我的第二个实现是我想使用的那个。
    • 如果将 [XmlIgnore] 放在子类/覆盖属性上,则该属性将被忽略,并且该值将被序列化和反序列化。
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2011-03-15
    • 2021-12-08
    • 2013-03-12
    相关资源
    最近更新 更多