2012-07-17 42 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的其他实例的引用。