我有一个WCF服务,其方法是UpdateProperty,它在参数中采用了PropertyValue:
void UpdateProperty(PropertyValue propertyValue)
[DataContract]
public class PropertyValue
{
[DataMember]
public string Property { get; private set; }
[DataMember]
public object Value { get; private set; }
}
我正在尝试使用KeyValuePair作为Value调用该方法,并且我收到此错误:
“格式化程序在尝试反序列化时抛出异常 消息:尝试反序列化参数时出错 http://tempuri.org/:propertyValue。 InnerException消息是 '第1行中的错误544.元素 'http://schemas.datacontract.org/2004/07/MyProject.DataContracts:Value' 包含映射到名称的类型的数据 'http://schemas.datacontract.org/2004/07/System.Collections.Generic:KeyValuePairOfanyTypeanyType'。 反序列化器不知道映射到此名称的任何类型。 如果您正在使用,请考虑使用DataContractResolver DataContractSerializer或添加对应的类型 'KeyValuePairOfanyTypeanyType'到已知类型列表 - for 例如,通过使用KnownTypeAttribute属性或将其添加到 传递给序列化程序的已知类型列表。'。请参阅 InnerException以获取更多详细信息。“
我尝试在我的课程中添加一个KnownType,但我仍然收到错误:
[KnownType(typeof(KeyValuePair<object, object>))]
知道为什么吗?我在其他方法(作为参数)中使用其他KeyValuePair而没有问题...
在我的SOAP主体中,我有:
<d4p1:Value xmlns:d7p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" i:type="d7p1:KeyValuePairOfanyTypeanyType">
<d7p1:key>test</d7p1:key>
<d7p1:value>test</d7p1:value>
</d4p1:Value>
答案 0 :(得分:0)
我想我知道你想要什么。尝试将此对象作为输入:
[Serializable]
public class WebServiceInputGetDataParams : ISerializable
{
public Dictionary<string, object> Entries
{
get { return entries; }
}
private Dictionary<string, object> entries;
public WebServiceInputGetDataParams()
{
entries = new Dictionary<string, object>();
}
protected WebServiceInputGetDataParams(SerializationInfo info, StreamingContext context)
{
entries = new Dictionary<string, object>();
foreach (var entry in info)
{
entries.Add(entry.Name, entry.Value);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (var entry in entries)
{
info.AddValue(entry.Key, entry.Value);
}
}
}