2010-05-17 66 views
2

通過WCF操作傳遞泛型列表時遇到問題。在這種情況下,有一個int列表。示例4被描述爲here in MSDN。請注意,在MSDN示例中,描述如下:DataContract已知類型 - 傳遞數組

//這將成功序列化和反序列化,因爲通用列表等同於已添加到已知類型的int []。

以上,是DataContract:

[DataContract] 
    [KnownType(typeof(int[]))] 
    [KnownType(typeof(object[]))] 
    public class AccountData 
    { 
     [DataMember] 
     public object accNumber1; 

     [DataMember] 
     public object accNumber2; 

     [DataMember] 
     public object accNumber3; 

     [DataMember] 
     public object accNumber4; 


    } 

在客戶端,林調用這樣的操作:

DataTransfer.Service.AccountData data = new DataTransfer.Service.AccountData() 
{ 
    accNumber1 = 100, 
    accNumber2 = new int[100], 
    accNumber3 = new List<int>(), 
    accNumber4 = new ArrayList() 
}; 
cService.AddAccounts(data); 

而且,這裏是產生AccountData OBJ(WCF的裝飾品代理):

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="AccountData", Namespace="http://schemas.datacontract.org/2004/07/DataTransfer.Service")] 
[System.SerializableAttribute()] 
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.PurchaseOrder))] 
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.Customer))] 
[System.Runtime.Serialization.KnownTypeAttribute(typeof(int[]))] 
[System.Runtime.Serialization.KnownTypeAttribute(typeof(object[]))] 

例外情況是:

嘗試序列化參數 http://tempuri.org/:myEntity時發生錯誤。 InnerException消息是 '類型通用列表'與數據合同名稱 'ArrayOfint:http://schemas.microsoft.com/2003/10/Serialization/Arrays' 不是預期的。添加不是靜態已知的已知 類型

+4

究竟是什麼問題? – Vitalik 2010-05-17 01:31:15

+0

對不起,我現在添加了異常說明。請注意,它已包含DataContract中指定的KnownTypeAttribute。 – Erup 2010-05-17 13:31:15

+0

我遇到了同樣的問題。您不能將int []和List 添加到已知類型中,因爲它會拋出錯誤,抱怨它們是相同的。但是,如果我只是添加int [],則將爲列表引發序列化異常。奇怪的.... – Mas 2011-03-07 10:25:05

回答

1

的列表。如果你將宣佈你的類型,任何這樣的類型,然後序列化工作正常:

[DataContract] 
public class AccountData 
{ 
    [DataMember] 
    public object accNumber1 {get; set;} 

    [DataMember] 
    public int[] accNumber2 { get; set; } 

    [DataMember] 
    public List<int> accNumber3 { get; set; } 

    [DataMember] 
    public ArrayList accNumber4 {get; set;} 

} 

(我推薦使用屬性而不是公共領域)

你真的需要你的字段是類型對象嗎?如果上述課程過於嚴格,那麼有辦法使其更加靈活,但可能不如您想要的那樣靈活。

另請注意,KnownType屬性適用於整個類而不是單個屬性。

+0

我正在做KnownTypeAttribute測試和研究MSDN的例子(這就是爲什麼對象的道具)。我會嘗試你的建議。謝謝。 – Erup 2010-05-28 12:09:18

+0

@downvoter:我的回答有什麼問題? – 2010-06-22 08:37:39