2010-08-26 104 views
7

我有一個DataMember屬性的基類。我也有一個帶有DataMember屬性的派生類。在我的WCF項目中,我返回派生類。有沒有辦法阻止我的基類中的成員序列化?下面是一些示例代碼:WCF DataContract從派生類中序列化排除數據成員

public class BaseClass 
{ 
    public string ShortDescription {get;set;} 
    public string LongDescription {get;set;} 
} 

public class DerivedClass : BaseClass 
{ 
    public List<Description> Descriptions {get;set;} 
} 

在這段代碼我希望能夠隱藏繼承的成員SHORTDESCRIPTION和LongDescription,因爲他們現在已經過時。任何嘗試這樣做都不成功。這是我曾嘗試:

public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 

    // override the base class members 
    [IgnoreDataMember]  
    public override string ShortDescription {get;set;} 
    [IgnoreDataMember] 
    public override string LongDescription {get;set;} 
} 

public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 

    // shadow the base class members 
    [IgnoreDataMember]  
    public new string ShortDescription {get;set;} 
    [IgnoreDataMember] 
    public new string LongDescription {get;set;} 
} 

這兩種方法都不工作過。輸出到WSDL時,「DerivedClass」類型仍包含基類類型的「忽略」成員。

你可能想知道爲什麼我不只是改變基類。這是因爲我仍然使用原始形式的基類作爲WSDL類型的以前版本,以支持消費者的向後兼容性。以這種方式,我可以有一個返回BaseClass的v1000調用和一個返回DerivedClass的V1010調用。我可以根據需要添加和更改DerivedClass的功能,而不會影響v1000功能的消費者。

回答

2

最終我找到了一個合適的方法來處理這個任務。我沒有在我面前的代碼,所以我要去說明語法。這是一個非常簡單的解決方案,但它解決了我遇到的具體問題。

public class BaseClass 
{ 
    // leave this guy empty 
} 

public class DerivedClassVersion1 : BaseClass 
{ 
    [DataMember] 
    public string ShortDescription {get;set;} 

    [DataMember] 
    public string LongDescription {get;set;} 
} 

public class DerivedClassVersion2 : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 
} 

Badda bing!很簡單,但這是我所需要的。

0

試試這個:

public class BaseClass 
{ 
    [DataMember] 
    public virtual string ShortDescription {get;set;} 

    [DataMember] 
    public virtual string LongDescription {get;set;} 
} 

public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 

    public override string ShortDescription {get;set;} 
    public override string LongDescription {get;set;} 
} 

編輯:也許利用消息協定能夠精確地控制序列化可以工作:http://msdn.microsoft.com/en-us/library/ms730255.aspx

否則,你也可以考慮實施「WCF路由器」,這將允許您使用相同的端點,但將不同的版本路由到不同的服務。

+1

這產生了相同的結果。有趣的是,如果我執行覆蓋並提供[DataMember]屬性以試圖讓它顯示在DerivedClass的XML定義中,它仍然不會顯示在DerivedClass中,而是顯示在基類中。 – omatase 2010-08-26 20:01:16

+0

Hrmmpf ...是的,這不起作用;) – Kwal 2010-08-26 20:26:32

6

嘗試向兩個類添加[DataContract]屬性。這將告訴序列化程序查看[DataMember]和[IgnoreDataMember]屬性。如果沒有課程被[DataContract]歸因,所有公共成員都會被序列化。

[DataContract] 
public class BaseClass 
{ 
    [IgnoreDataMember] 
    public string ShortDescription {get;set;} 

    [IgnoreDataMember] 
    public string LongDescription {get;set;} 
} 

[DataContract] 
public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 
} 

此外,它甚至會更好,通過在指定它的命名空間添加到您的datacontracts [DataContract(命名空間=「...」)]屬性。這將打破舊客戶呼叫您的更新服務。

+0

值得注意的是,WITH [DataContract]上的類不再需要展開[IgnorDataMember] - 因爲只有具有[DataMember]的成員纔會包含在傳輸中。 – Ricibob 2016-09-07 09:20:26