保持WCF中Dictionary DataMember的向后兼容性

时间:2010-11-11 02:02:43

标签: c# wcf

在我的产品的第1版中,我有一个如下所示的DataMember:

[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功能来保持我的Dictionary&lt; string,Class1&gt;在v2代码上,但使用与版本1的DataContract兼容的DataContract?

3 个答案:

答案 0 :(得分:1)

根据您在问题中提供的信息,我不确定您可以执行您想要的操作:通常,对于您添加新数据成员的任何向后兼容性,您不会更改现有数据成员的类型。因此,您可能必须使用数据协定的相应更改创建另一个服务合同。最好通过以下链接阅读信息:Best Practices: Data Contract Versioning并将这些信息应用于您的情况。

您还可以通过以下链接阅读信息: 1. Data Contract Versioning 2. Forward-Compatible Data Contracts

答案 1 :(得分:1)

请参阅http://msdn.microsoft.com/en-us/library/aa347850.aspx

[CollectionDataContract
    (Name = "Class1Dictionary", 
    ItemName = "KeyValueOfEnumType1Class1UTLV0zE5", 
    KeyName = "Key", 
    ValueName = "Value")] public class MyDictionary : Dictionary<string, Class1> { }

答案 2 :(得分:0)

我最终弄清楚了正确的答案。只要DataContracts兼容,它就会起作用。在这方面,那些时髦的生成名称被忽略了。这意味着

List<KeyValuePair<string,Class1>>

兼容:

Dictionary<string,Class1>