Как игнорировать свойство базового класса в производном классе при использовании XmlSerializer?

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

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


person Learner    schedule 12.07.2011    source источник
comment
OrgDeptID — это stackoverflow, кстати — опечатка?   -  person Marc Gravell    schedule 12.07.2011
comment
@Marc Марк: я не понял (OrgDeptID is a stackoverflow) твой вопрос. Я не копировал весь код здесь. Я только что написал пару свойств здесь, чтобы смоделировать сценарий.   -  person Learner    schedule 12.07.2011
comment
И OrgStructure.description (поле) никогда не используется; выброси это.   -  person Marc Gravell    schedule 12.07.2011
comment
Смотри внимательно; OrgDeptID вызывает OrgDeptID, который вызывает OrgDeptID, который вызывает OrgDeptID - должно быть return orgDeptID (обратите внимание на нижний регистр o). Не критично, но на полсекунды сбил меня с толку.   -  person Marc Gravell    schedule 12.07.2011
comment
@Marc: я ценю ваше наблюдение (+1). Я виноват.   -  person Learner    schedule 12.07.2011


Ответы (1)


В базовый класс добавьте:

public virtual bool ShouldSerializeDescription() { return true; }

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

public override bool ShouldSerializeDescription() { return false; }

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

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

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

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

person Marc Gravell    schedule 12.07.2011
comment
Какой классный ответ!!! Большое спасибо. Откуда вы узнали об этом? Не могли бы вы указать читателям на какую-нибудь документацию MS, где обсуждается этот или соответствующий вопрос? - person Learner; 12.07.2011
comment
@CSharpLearner, если я когда-нибудь найду его, я дам вам знать; p IIRC это обсуждается в обсуждении [DefaultValue] и в PropertyDescriptor здесь: msdn.microsoft.com/en-us/library/ - person Marc Gravell; 12.07.2011
comment
Я нашел две полезные ссылки, связанные с ним: msdn .microsoft.com/en-us/library/53b8022e(v=VS.100).aspx и funcakes.posterous.com/ - person Learner; 13.07.2011