2011-05-10 63 views
4

在我的WCF服務中,我將對象QualifiedNumber定義爲KnownTypeServiceKnown類型。如果我在以下方法中使用QualifiedNumber爲什麼WCF不能傳遞字典中的對象?

這一個不起作用。它拋出一個異常,在部分內容:

元素「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; 
} 

它是什麼導致異常的字典嗎?

+6

友情提醒 - 你應該接受一些答案。 – 2011-05-10 17:18:42

回答

0

標記QualifiedNumberSerializeable屬性。

+0

不幸的是,添加Serializable屬性並沒有幫助。 – JerryKur 2011-05-10 17:43:36

1

您只需將以下屬性添加到您的datacontract類。

[DataMember] 
public object UsedForKnownTypeSerializationObject; 

所以現在生成的代理包含您在datacontract上設置的Knowtypes。我有同樣的問題,這是我想出的唯一解決方案。如果您在Object類型的屬性不給你DataContract類,生成的代理不包含聲明knowtypes

例如:

[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; } 

} 

這不是因爲漂亮,因爲你結束了一個沒有任何功能實現的虛擬屬性。但是,我再次沒有其他解決方案。

0

您可以將字典包裝在列表中。 所以,你的代碼看起來像:

[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; 
} 

It's不是真的很漂亮。但一個簡單的方法來通過WCF傳輸字典。

相關問題