2011-07-12 1 views
2

J'ai une classe comme ceci:Comment ignorer la propriété de la classe de base dans la classe dérivée lors de l'utilisation de 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; 
      } 
     } 
} 

Une autre classe comme ci-dessous au-dessus d'une hérite:

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

      } 
     } 
} 

Je suis émigrent service ASMX pour WCF les garder compatibles avec les clients ASMX existants. Donc, je dois utiliser le XmlSerializer au lieu de DataContractSerializer. Le OrgStructure est déclaré MessageBodyMember dans le type de réponse OperationContract.

Le client ASMX n'attend PAS leDescription dans le message XML. J'ai donc essayé de masquer (en utilisant l'opérateur new) la propriété Description dans la classe dérivée et de lui appliquer XmlIgnoreAttribute. Mais encore il sérialise cette propriété.

(S'il vous plaît noter que la déclaration de la description variable. Je ne sais pas pourquoi développeur a déclaré à nouveau la classe dérivée au lieu le garder protected dans la classe de base elle-même.)

Comment puis-je ignorer la propriété de la base classe dans la classe dérivée lors de l'utilisation de XmlSerializer? Je ne peux pas l'ignorer dans la classe de base puisque les autres sous-types de Structure en ont besoin.

+0

OrgDeptID est un stackoverflow, BTW - faute de frappe? –

+0

@Marc: Je n'ai pas reçu ('OrgDeptID est un stackoverflow') votre question. Je n'ai pas copié le code entier ici. Je viens d'écrire quelques propriétés ici pour simuler un scénario. – Learner

+0

OrgStructure.description (field) n'est jamais utilisé; jette-le. –

Répondre

3

à la classe de base, ajouter:

public virtual bool ShouldSerializeDescription() { return true; } 

et à la classe dérivée, ajouter:

public override bool ShouldSerializeDescription() { return false; } 

Ceci est un modèle qui XmlSerializer reconnaît, mais doit être déclarée au même niveau que le membre (Description), d'où la nécessité de le faire virtual.

Insulte l'œil, ajouter:

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

lui - mais il doit êtrepublic travailler.

+0

Quelle réponse géniale !!! Merci beaucoup. D'où avez-vous appris cela? Pourriez-vous s'il vous plait attirer l'attention des lecteurs vers une documentation de MS où cette question ou une chose pertinente est discutée? – Learner

+1

@CSharpLearner si jamais je le trouve, je vous le ferai savoir; p IIRC il est discuté dans la discussion '[DefaultValue]', et dans 'PropertyDescriptor', ici: http://msdn.microsoft.com/fr us/library/system.componentmodel.propertydescriptor.canresetvalue.aspx –

+0

Merci @Marc. :) – Learner

Questions connexes