2010-02-11 66 views
4

我想請求你的幫助。我在這裏有問題與字典的WCF反序列化,其中枚舉類型被用作關鍵字。WCF反序列化的字典枚舉類型是關鍵

我有兩個數據對象:

[DataContract] 
public enum MyEnum : int 
{ 
    [EnumMember] 
    Value1 = 0, 
    [EnumMember] 
    Value2 = 1 
} 

[DataContract] 
[KnownType(typeof(MyEnum))] 
public class ReturnData 
{ 
    [DataMember] 
    public IDictionary<Enum, string> codes; 
} 

事實上ReturnData類包含多個數據成員,但他們不是我的例子很重要。

目的通過方法返回這些數據:

[OperationContract] 
public ReturnData Method1() 
{ 
ReturnData data = new ReturnData(); 
data.codes = new Dictionary<Enum, string>(); 
data.codes.Add(MyEnum.Value1, "stringA"); 

return data; 
} 

當我打電話方法1從客戶端然後下拋出異常:

格式化引發了異常,而試圖反序列化消息:嘗試反序列化參數http://tempuri.org/:Method1Result時發生錯誤。 InnerException消息是'第1行位置522錯誤。元素'http://schemas.microsoft.com/2003/10/Serialization/Arrays:Key'包含'http://schemas.datacontract.org/2004/07/AMService:MyEnum'數據合約的數據。反序列化器不知道映射到此合約的任何類型。將與'MyEnum'相對應的類型添加到已知類型列表中 - 例如,使用KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型列表中。

任何想法如何定義ReturnData類來解決這個問題?

注:當我改變ReturnData成員codes關鍵數據類型MyEnum而不是Enumpublic IDictionary<MyEnum, string> codes;然後反序列化可以正常工作和數據從服務器端客戶端沒有問題轉移到使用。

感謝您的幫助。

+2

傑森您好!你有沒有得到這個問題的答案?我有與涉及列表和字典相同的問題。 – Nayan 2011-10-10 13:55:14

回答

2

在班級頂部添加KnownType屬性。

using System.Runtime.Serialization; 

[KnownType(typeof(MyEnum))] 
[DataContract] 
public class Foo { 

} 
+0

kime waza感謝您的回答。但是,如果你再次檢查我的類ReturnData,你可以看到'KnownType'屬性已經存在了...... – 2010-02-11 08:06:48

+0

是的,你是否在我做了我的答案後添加了,我以前沒有看到它? :)你有沒有嘗試用服務器上的KnownType屬性重新生成客戶端代理? – 2010-02-11 10:21:30

0

should'nt此行

data.codes = new Dictionary<Enum, string>(); 

data.codes = new Dictionary<MyEnum, string>(); 
+0

編號 這是不可能編譯:IDictionary codes = new Dictionary (); – 2010-02-11 10:18:40

+0

IDictionary codes = new Dictionary (); – Neil 2010-02-11 11:38:41

+0

是的,這是有效的。它寫在我原來的帖子的註釋部分。但問題是如何使序列化的IDictionary 數據成員。 – 2010-02-11 12:15:18