为什么WCF不能传递字典中的对象?

在我的WCF服务中,我将对象QualifiedNumber定义为KnownTypeServiceKnown类型。 如果我在以下方法中使用QualifiedNumber

这个不起作用。 它抛出一个exception,部分内容如下:

元素’ http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value ‘包含’ http://schemas.datacontract.org/2004/07 ServiceLibrary.Web.Model:QualifiedNumber’数据合同的数据。 反序列化器不知道映射到此合同的任何类型。 无法反序列化,因为QualifiedNumber的定义未知。

 [OperationContract] public Dictionary TestDictionaryGet() { Dictionary retDict = new Dictionary(); retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<")); retDict.Add(2, "pass a simple string"); return retDict; } 

这个工作

 public struct element { public int key; public object value; } [OperationContract] public List TestElementListGet() { Dictionary retDict = new Dictionary(); retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<")); retDict.Add(2, "pass a simple string"); List retElements = new List(); foreach (KeyValuePair item in retDict) { element newElement; newElement.key = item.Key; newElement.value = item.Value; retElements.Add(newElement); } return retElements; } 

什么是导致exception的字典?

这是关于WCF上的通用字典序列化的详细文章:

http://www.request-response.com/blog/PermaLink,guid,ff5fab81-affb-4b2b-aa67-c80bdfc86cbd.aspx

该文章的内容引用如下:

使用WSDL / XSD无法有意义地传达.NET字典类的语义。

您只需将以下属性添加到datacontract类。

 [DataMember] public object UsedForKnownTypeSerializationObject; 

所以现在生成的代理包含您在datacontract上设置的Knowtypes。 我遇到了同样的问题,这是我提出的唯一解决方案。 如果您没有在DataContract类的Object类型的属性,生成的代理不包含声明的知识类型

例如:

 [DataContract] [KnownType(typeof(List))] public class Foo { [DataMember] public String FooName { get; set; } [DataMember] public IDictionary Inputs { get; set; } [DataMember] private Object UsedForKnownTypeSerializationObject{ get; set; } } 

它不是那么漂亮,因为你最终得到了一个没有任何function实现的虚拟属性。 但话又说回来,我没有其他解决方案。

使用Serializeable属性标记QualifiedNumber

您可以将Dictionary包装在List中。 所以你的代码看起来像:

 [OperationContract] public List> TestDictionaryGet() { var resultList = new List>(); Dictionary retDict = new Dictionary(); retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<")); retDict.Add(2, "pass a simple string"); resultList.Add(retDict); return resultList; } 

这不是很漂亮。 但是通过WCF传输Dictionary的简单方法。