2011-07-12 39 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; 
      } 
     } 
} 

像下面另一類繼承上面一個:

[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

OrgStructureOperationContract的響應類型中聲明爲MessageBodyMember

ASMX客戶端不是預計XML消息中的Description。所以我試圖隱藏(使用new運算符)派生類中的Description屬性並將XmlIgnoreAttribute應用於它。但它仍然序列化這個屬性。

(請注意,description變量的聲明。我不知道爲什麼開發商再次聲明的派生類,而不是保持它protected在基類本身)。

我怎能無視基本的財產在使用XmlSerializer的派生類中的類?我不能忽視它在基類中,因爲Structure的其他子類型需要它。

+0

OrgDeptID是一個計算器,順便說一句 - 錯字? –

+0

@Marc:我沒有得到('OrgDeptID是一個stackoverflow')你的問題。我沒有在這裏複製整個代碼。我在這裏寫了幾個屬性來模擬場景。 – Learner

+0

並且OrgStructure.description(field)永遠不會被使用;把它扔掉。 –

回答

3

To的基類中,添加:

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它是在'[默認值]'中所討論,並在'PropertyDescriptor',在這裏:http://msdn.microsoft.com/en- us/library/system.componentmodel.propertydescriptor.canresetvalue.aspx –

+0

Thanks @Marc。 :) – Learner

相關問題