[英]Why can't WCF pass an object in a dictionary?
在我的WCF服务中,我将对象QualifiedNumber
定义为KnownType
和ServiceKnown
类型。 如果我在以下方法中使用了QualifiedNumber
:
这一项不起作用。 它抛出一个部分读取的异常:
元素' http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value '包含' http://schemas.datacontract.org/2004/07 ServiceLibrary.Web.Model:QualifiedNumber'数据协定的数据。 解串器不知道任何映射到该合同的类型。 无法反序列化,因为QualifiedNumber的定义未知。
[OperationContract]
public Dictionary<int, object> TestDictionaryGet()
{
Dictionary<int, object> retDict = new Dictionary<int, object>();
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<element> TestElementListGet()
{
Dictionary<int, object> retDict = new Dictionary<int, object>();
retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<"));
retDict.Add(2, "pass a simple string");
List<element> retElements = new List<element>();
foreach (KeyValuePair<int, object> item in retDict)
{
element newElement;
newElement.key = item.Key;
newElement.value = item.Value;
retElements.Add(newElement);
}
return retElements;
}
导致异常的字典是什么?
这是有关通过WCF进行通用词典序列化的详细文章:
http://www.request-response.com/blog/PermaLink,guid,ff5fab81-affb-4b2b-aa67-c80bdfc86cbd.aspx
该文章的外卖报价为:
无法使用WSDL / XSD有意义地传达.NET词典类的语义。
您只需要向datacontract类添加以下属性。
[DataMember]
public object UsedForKnownTypeSerializationObject;
因此,现在生成的代理包含您在数据合同上设置的知识类型。 我遇到了同样的问题,这是我想到的唯一解决方案。 如果您不在DataContract类的Object类型的属性中,则生成的代理不包含声明的知识类型
例如:
[DataContract]
[KnownType(typeof(List<String>))]
public class Foo
{
[DataMember]
public String FooName { get; set; }
[DataMember]
public IDictionary<String, Object> Inputs { get; set; }
[DataMember]
private Object UsedForKnownTypeSerializationObject{ get; set; }
}
它不是那么漂亮,因为您最终得到一个没有任何功能实现的虚拟属性。 但话又说回来,我没有其他解决方案。
您可以将字典包装在列表中。 因此您的代码如下所示:
[OperationContract]
public List<Dictionary<int, object>> TestDictionaryGet()
{
var resultList = new List<Dictionary<int, object>>();
Dictionary<int, object> retDict = new Dictionary<int, object>();
retDict.Add(1, new QualifiedNumber(new decimal(1.2), "<"));
retDict.Add(2, "pass a simple string");
resultList.Add(retDict);
return resultList;
}
这不是很漂亮。 但是通过WCF传输字典的一种简单方法。
使用Serializeable
属性标记QualifiedNumber
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.