[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错误"The socket connection has been disposed.\r\nObject name: 'System.ServiceModel.Channels.SocketConnection'." . 我怀疑这个错误是因为字段ChildAssets . 当我单独禁用此字段时(通过删除DataMember标记),然后在客户端,我能够获取所有Dictionary元素,并在每个元素中包含除ChildAssets之外的所有字段 . 我能够看到剩余的字段Name,ParentNode和Priority .
任何线索为什么WCF无法在Dictionary元素中序列化List?
1 回答
我已经通过将
IsReference = true
添加到我的DataContract类AssetData来解决了这个问题 . 对象图引用了AssetData类的其他实例 . ChildAssets成员只是对AssetData的其他实例的引用 .