奇怪的.Net序列化问题

本文关键字:序列化 问题 Net | 更新日期: 2023-09-27 17:47:47

我今天在尝试序列化一个对象时遇到了一个奇怪的问题。该对象是通过web服务(svcutil.exe)中的"添加服务引用"生成的。

问题是以下属性(agencyId)没有与对象的其余部分序列化。出于绝望,我评论了下面的属性,因为它分配了"XMLIgnoreAttribute"。。。在我评论了被忽略的属性后,agencyId字段按预期序列化。

有人能向我解释一下为什么会发生这种行为吗?谢谢

        /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
    public string agencyId
    {
        get {
            return this.agencyIdField;
        }
        set {
            this.agencyIdField = value;
            this.RaisePropertyChanged("agencyId");
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool agencyIdSpecified
    {
        get
        {
            return this.agencyIdFieldSpecified;
        }
        set
        {
            this.agencyIdFieldSpecified = value;
            this.RaisePropertyChanged("agencyIdSpecified");
        }
    }

奇怪的.Net序列化问题

有一个模式(对于XmlSerializer),属性Foo也将查找"bool FooSpecified"或"bool ShouldSerializeFoo()"-如果找到,则仅在其他成员返回true时序列化Foo。所以我认为agencyIdSpecified从未设置为true?删除此成员将使其始终序列化(除非添加[DefaultValue]或类似的成员)。

当我们真的需要知道它是否在原始数据中时,这种类型的行为用于对可选值进行建模,即它的值是0,是因为调用者告诉了我们这个数字,还是因为这只是默认值。

请注意,"FooSpecified"成员通常具有[XmlIgnore],因此XmlSerializer知道它不应被视为序列化的数据。这对于"ShouldSerializeFoo()"来说是不必要的(事实上也是合法的),因为方法从来都不是序列化的。

XmlIgnoreAttribute的目的是告诉XmlSerializer您不想序列化该属性:这是重点。因此,您看到的是该代码的设计行为。一个更好的问题是,类实现者为什么选择以这种方式装饰该属性。