Как игнорировать свойство базового класса в производном классе при использовании XmlSerializer? - PullRequest
2 голосов
/ 12 июля 2011

У меня есть такой класс:

[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.

1 Ответ

3 голосов
/ 12 июля 2011

К базовому классу добавьте:

public virtual bool ShouldSerializeDescription() { return true; }

и к производному классу добавьте:

public override bool ShouldSerializeDescription() { return false; }

Это шаблон, который XmlSerializer распознает, но должен быть объявленна том же уровне, что и член (Description), поэтому необходимо сделать его virtual.

Если это оскорбляет глаз, добавьте к нему:

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

к нему -но должен быть public для работы.

...