2010-11-11 35 views
0

在我的產品的版本1我有一個數據成員,看起來像這樣:Mantaining向後字典數據成員的兼容性WCF

[DataMember] 
private Dictionary< EnumType1, Class1> Class1Dictionary; 

凡EnumType1被定義爲:

[Flags] 
public enum EnumType1 
{ 
    EnumMember1 = 1; 
    EnumMember2 = 2; 
    EnumMember3 = 4; 
} 

的SOAP消息看起來像這樣(我是釋義):

<Class1Dictionary> 
    <KeyValueOfEnumType1Class1UTLV0zE5> 
     <Key>EnumMember1 </Key> 
     <Value> ... </Value> 
    </KeyValueOfEnumType1Class1UTLV0zE5> 
</Class1Dictionary> 

在版本2中,我想將Class1Dictionary更改爲一個Dictionary<string, Class1>而不是Dictionary<EnumType1, Class1>,但我想保持服務級別與以前的版本兼容。當然,版本V2服務器/客戶端只知道如何處理Key的特定值,以匹配它所知道的枚舉值。對於所有其他異常是預期的行爲。

我的第一個想法是隻改變Class1Dictionary:

[DataMember] 
private Dictionary< string, Class1> Class1Dictionary; 

,但是這會扭曲SOAP消息,例如改變KeyValueOfEnumType1Class1UTLV0zE5到別的東西。所以問題是,我怎樣才能使用此DataMember或使用任何其他WCF功能來保留我的字典<字符串Class1>在v2代碼上,但是使用與Data1版本1的DataContract兼容的DataContract?

回答

0

我最終找出正確的答案。只要DataContracts兼容,就可以工作。那些時髦的生成名稱在這方面被忽略。這意味着,

List<KeyValuePair<string,Class1>> 

與兼容:

Dictionary<string,Class1> 
1

根據你在問題中給出的信息,我不確定你可以做你想做的事情:通常爲了任何向後兼容性你添加新的數據成員,你不會改變現有數據成員的類型。因此,您可能必須創建另一個服務合同以及數據合同的相應更改。如果您閱讀以下鏈接中的信息,最好是:Best Practices: Data Contract Versioning並將這些信息應用於您的情況。

您還可以通過以下鏈接閱讀信息:1. 2. Data Contract VersioningForward-Compatible Data Contracts