在我的产品的第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?
答案 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>