【问题标题】:WCF was unable to deserialize List with in a Dictionary elementWCF 无法在 Dictionary 元素中反序列化 List
【发布时间】:2012-07-17 08:44:28
【问题描述】:
[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 元素中序列化 List 吗?

【问题讨论】:

  • 你用的是什么客户端?也许客户端上的 web 服务引用需要 ObservableCollection 而不是 List
  • Rumplin,现在客户端和服务器都在同一个进程中。我正在使用 .NET 4.0 框架和 C# 语言。它是一个自托管服务,在客户端(在我的情况下,这只是同一进程中的另一个 dll)我将对象转换为 Dictionary。一切都很好,除了 DataMember ChildAssets
  • 只是为了测试,把List改为ObservableCollection
  • 当您包含子资产时,您是否可能达到绑定中定义的限制? IE。深度限制,最大缓冲区大小等?要进行测试,请重新包含 ChildAssets 并强制该方法仅返回具有单个键值对的字典,其中包含只有一个子项的 AssetData。

标签: c# wcf


【解决方案1】:

我已通过将 IsReference = true 添加到我的 DataContract 类 AssetData 来解决此问题。对象图具有对 AssetData 类的其他实例的引用。 ChildAssets 成员只是对 AssetData 其他实例的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2017-01-15
    • 2020-05-06
    相关资源
    最近更新 更多