2012-07-17 20 views
0
[DataContract] 
    public class AssetData 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public List<AssetData> ChildAssets { get; set; } 
     [DataMember] 
     public int Priority { get; set; } 
     [DataMember] 
     public AssetData ParentNode { get; set; } 
    } 

[ServiceKnownType(typeof(Dictionary<string, AssetData>))] 
    public interface IRtxEquipmentConfiguration 
    { 
     [OperationContract] 
     object GetData(string sKey, string sRequest); 
    } 

與反序列化信息列表上述OperationContract的"GetData"服務器返回AssetData的字典。 我已經將AssetData標記爲DataContract,並將其所有字段標記爲DataMembers。 在客戶端,我得到了wcf錯誤「套接字連接已被處置。\ r \ n對象名稱:'System.ServiceModel.Channels.SocketConnection'。」。我懷疑這個錯誤是因爲字段ChildAssets。 當我單獨禁用此字段時(通過刪除DataMember標籤),然後在客戶端,我能夠獲取所有Dictionary元素,並在每個元素中使用除ChildAssets之外的所有字段。 我能夠看到剩餘的字段名稱,父節點和優先級。WCF無法在Dictionary元件

任何線索爲什麼WCF無法序列化字典元素中的列表?

+0

你在使用什麼客戶端?也許客戶端上的Web服務引用想要一個ObservableCollection而不是一個列表 – Rumplin 2012-07-17 08:47:52

+0

Rumplin,現在客戶端和服務器都在同一個進程中。我正在使用.NET 4.0框架和C#語言。它是一個自我託管的服務,在客戶端(在我的情況下,在同一個進程中,這只是另一個DLL)我將對象強制轉換爲Dictionary 。一切都很好,除了DataMember ChildAssets – Imran 2012-07-17 08:50:50

+0

只是爲了測試,將列表更改爲ObservableCollection Rumplin 2012-07-17 08:59:58

回答

0

我已經通過將IsReference = true添加到我的DataContract類AssetData中解決了該問題。對象圖具有對AssetData類的其他實例的引用。 ChildAssets成員只是對AssetData的其他實例的引用。