2

我有这样的课:

[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 客户端期望Description在 XML 消息中。所以我试图隐藏(使用new运算符)Description派生类中的属性并应用于XmlIgnoreAttribute它。但它仍然序列化了这个属性。

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

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

4

1 回答 1

3

在基类中添加:

public virtual bool ShouldSerializeDescription() { return true; }

并在派生类中添加:

public override bool ShouldSerializeDescription() { return false; }

这是一种可以XmlSerializer识别的模式,但必须在与成员 ( Description) 相同的级别声明,因此需要 make 它virtual

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

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

对它 - 但它必须工作public

于 2011-07-12T12:23:53.583 回答