2010-06-09 49 views
1

WCF問題,我有一個實現以下數據成員服務:與KnownType的字典

[DataMember] 
public Dictionary<string, List<IOptionQueryResult>> QueryResultItems { get; set; } 

我有類「OptionQuerySingleResult」從IOptionQueryResult繼承。現在,我明白,我需要讓OptionQueryResult型「已知」的服務,從而試圖添加KnownType以不同的方式:

[KnownType(typeof(Dictionary<string, OptionQuerySingleResult[]>))] 
[KnownType(typeof(Dictionary<string, List<OptionQuerySingleResult>>))] 
[KnownType(typeof(OptionQuerySingleResult)] 

然而,沒有這些方法的工作,並在客戶端上我無論是獲取反序列化失敗還是服務器簡單地中止請求,導致連接中止錯誤。

有沒有人有什麼正確的方法來得到這個工作的想法? 我想補充說,如果我改變QueryResultItems定義使用具體類型,而不是界面,一切正常。

感謝,

湯姆

編輯: ,我得到的例外是:在線路

錯誤1位524元「http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType」包含映射到一個數據類型名稱':OptionQuerySingleResult'。反序列化器不知道映射到該名稱的任何類型。考慮使用DataContractResolver或將與'OptionQuerySingleResult'對應的類型添加到已知類型列表中 - 例如,通過使用KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型列表。

然而,當我看着SvcUtil工具生成客戶端代理,「OptionQuerySingleResult」肯定是在它定義爲:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="OptionQuerySingleResult", Namespace="")] 
[System.SerializableAttribute()] 
public partial class OptionQuerySingleResult : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 

回答

1

我想你會用:

[KnownType(typeof(OptionQuerySingleResult)] 

但是你還需要您的OptionQuerySingleResult類上的[DataContract(Name = "OptionQuerySingleResult")]

我認爲這也依賴於由SVCUTIL.EXE util生成的客戶端代理類。

+0

不幸的是,這似乎也不起作用。奇怪的是,如果我添加[KnownType(typeof(OptionQuerySingleResult)]並返回一個IOptionQueryResult列表,而不是字典,它工作得很好。 – TJF 2010-06-10 13:36:46

0

您只需將以下屬性添加到您的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; } 

} 

,因爲你最終它並不像漂亮與一個虛擬財產,沒有任何 功能實施。但是,我再次沒有其他解決方案。