WCF服务中的KeyValuePair

时间:2016-11-10 09:55:07

标签: c# wcf serialization

我有一个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>

1 个答案:

答案 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);
        }
    }
}