2011-07-12 12 views
2

私はこのようなクラスがあります:以下のような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; 
      } 
     } 
} 

別のクラスは、1を超える継承:

[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サービスを移行しています。だからDataContractSerializerの代わりにXmlSerializerを使用する必要があります。

応答タイプがOperationContractの場合、OrgStructureMessageBodyMemberと宣言されています。

ASMXクライアントは、XMLメッセージにDescriptionを期待していません。そこで、派生クラスのDescriptionプロパティを非表示にして(new演算子を使用)、XmlIgnoreAttributeを適用しようとしました。しかし、それはまだこのプロパティをシリアル化します。

description変数の宣言ことに注意してください。開発者は、基本クラス自体にprotectedそれを維持する代わりに、再び派生クラスを宣言した理由を私は知らない。)

どのように私はベースのプロパティを無視することができますXmlSerializerを使用している間、派生クラスのクラス? Structureの他のサブタイプはそれを必要とするので、私は基本クラスでそれを無視することはできません。基底クラスに

+0

OrgDeptIDは、スタックオーバーフロー、BTW-typoですか? –

+0

@Marc:あなたの質問に( 'OrgDeptID is stackoverflow'は)得られませんでした。私はここでコード全体をコピーしていない。シナリオをシミュレートするためにここにプロパティのカップルを書きました。 – Learner

+0

OrgStructure.description(field)は決して使用されません。それを捨てる。 –

答えて

3

、追加:

public virtual bool ShouldSerializeDescription() { return true; } 

と派生クラスには、追加:

public override bool ShouldSerializeDescription() { return false; } 

これはXmlSerializerが認識パターンであるが、同じレベルで宣言されなければなりませんメンバー(Description)ですので、それを作る必要がありますvirtual

それは、目を傷つける場合は、いくつかの追加:

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

それに - それは仕事にpublicでなければなりません。

+0

すてきな答え!どうもありがとう。どこからこれを学びましたか?あなたは、このまたは関連することが議論されているいくつかのMSの文書を読者に指摘してください。 – Learner

+1

@CSharpLearnerもし私がこれを見つけたら、私はあなたに知らせます; p IIRCは '[DefaultValue]'議論と 'PropertyDescriptor'で議論されています:http://msdn.microsoft.com/en-私/ライブラリ/ system.componentmodel.propertydescriptor.canresetvalue.aspx –

+0

ありがとう@Marc。 :) – Learner

関連する問題