gpt4 book ai didi

.net - XmlIgnoreAttribute,只在序列化时使用,反序列化时不使用?

转载 作者:行者123 更新时间:2023-12-04 15:37:54 24 4
gpt4 key购买 nike

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

Instructs the Serialize method of the XmlSerializer not to serialize the public field or public read/write property value.



那:
  • 如果 XML 文件中存在该属性,则该属性将被反序列化?
  • 该属性不会被序列化为新的 XML 文件吗?

  • 我问的原因是我已经用具有更多选项的新属性替换了文件中的属性。旧属性是一个简单的 bool 属性,而新属性是一个枚举。我已经更改了旧属性,以便将新属性的值转换为 bool 值,根据旧属性在添加新属性之前的含义,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 属性,并将保留其默认值。

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

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

    关于.net - XmlIgnoreAttribute,只在序列化时使用,反序列化时不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350453/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com