如何在使用XmlSerializer时忽略派生类中基类的属性?

时间:2011-07-12 12:11:05

标签: .net wcf web-services xmlserializer messagecontract

我有一个这样的课程:

[Serializable]
    public class Structure
    {
        #region Constants and Fields

        /// <summary>
        /// The description.
        /// </summary>
        private string description;


        #endregion


        /// <summary>
        ///   Gets or sets the Description of the subclass i.e subtype of structure
        /// </summary>
        public string Description
        {
            get
            {
                return this.description;
            }

            set
            {
                this.description = value;
            }
        }
}

下面的另一个类继承了上面的一个:

[XmlRoot(Namespace = "TestNamespace", ElementName = "OrgStructure")]
    public class OrgStructure : Structure
    {


        private long orgDeptID;

        /// <summary>
        ///   The description
        /// </summary>
        private string description;

  public long OrgDeptID
        {
            get
            {
                return this.orgDeptID;
            }

            set
            {
                this.orgDeptID= value;

            }
        }
}

我正在将ASMX服务迁移到WCF,以使它们与现有的ASMX客户端兼容。所以我必须使用XmlSerializer代替DataContractSerializer

OrgStructure的响应类型中MessageBodyMember被声明为OperationContract

ASMX客户端期望XML消息中的Description。所以我尝试隐藏(使用new运算符)派生类中的Description属性并将XmlIgnoreAttribute应用于它。但它仍然序列化这个属性。

(请注意description变量的声明。我不知道为什么开发人员再次声明派生类而不是将它protected保留在基类本身。)

在使用XmlSerializer时,如何忽略派生类中基类的属性?我不能在基类中忽略它,因为Structure的其他子类型需要它。

1 个答案:

答案 0 :(得分:3)

在基类中添加:

public virtual bool ShouldSerializeDescription() { return true; }

和派生类,添加:

public override bool ShouldSerializeDescription() { return false; }

这是XmlSerializer识别的模式,但必须在与成员(Description)相同的级别声明,因此需要将其virtual

如果它冒犯了眼睛,请添加一些:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]

到它 - 但必须 public才能正常工作。