【问题标题】:how can I pass a dictionary of items contianing dictionaries of items?如何传递包含项目字典的项目字典?
【发布时间】:2011-05-10 22:26:18
【问题描述】:

我有一个服务,我试图通过它传递一个对象字典。一切都很好,直到我添加一个对象字典,然后将字典包含到另一个对象。在下面的示例中,导致问题的字典是 A 类。

    //example

    public class A
    {
     public Dictionary<string,B> BValues { get; set; }
    }

    public class B
    {
     public Dictionary<string, C> CValues { get; set; }
    }

    public class C
    {
     int x;
     int y;
    }

我已经尝试在我的服务中制作字典 knowntypes,并确保其他类被标记为数据协定,它们的属性用 DataMember 属性标记。我不知道我还需要做什么,甚至可以做什么才能完成这项工作。

编辑

例外:

元素 'schemas.microsoft.com/2003/10/Serialization/Arrays:Value'; 包含的数据 'schemas.microsoft.com/2003/10/Serialization/…; 数据合同。解串器没有 映射到的任何类型的知识 这份合同。添加类型 对应于 'ArrayOfKeyValueOfstringClassValuesNSpYOWsW' 到已知类型的列表 - 对于 例如,通过使用 KnownTypeAttribute 属性或由 将其添加到已知类型列表中 传递给 DataContractSerializer。'

【问题讨论】:

  • 有什么问题?你得到一个序列化异常,还是只是空属性?需要更多信息。
  • 一切构建和更新都很好。当我正在运行并且它实际上尝试序列化要发送到客户端的对象时,它得到了一个序列化异常。
  • 例外情况是:元素“schemas.microsoft.com/2003/10/Serialization/Arrays:Value”包含“schemas.microsoft.com/2003/10/Serialization/…”数据合约的数据。反序列化器不知道映射到该合约的任何类型。将与“ArrayOfKeyValueOfstringClassValuesNSpYOWsW”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。
  • 我不确定的一件事,它以这种方式在 xsd 中创建信息,名称的末尾有乱码,不确定是否有问题,但也许这就是来源我的挫败感?

标签: wcf silverlight-4.0 datacontractserializer


【解决方案1】:

为了尝试找出失败的地方,我设置了一个简单的 WCF 服务,它返回一个非常基本的嵌套 Dictionary,它在添加了许多项目时效果很好。

    [OperationContract]
    Dictionary<int, Dictionary<int, int>> GetDictionary();

基于此,我假设这是您的对象的问题(&也许它们在Dictionary 集合中的事实)。我建议你做一些测试来缩小你的问题范围。

你的类是可序列化的 - 你能反序列化你的类型的单个实例吗? (例如,编写一个操作以返回像 MyClass GetOneInstance(); 这样的对象)。你能返回你班级的简单Dictionary吗?

WCF 可能会向您抛出一些命名冲突 - 如果您的类与您的服务或操作具有相同的名称,例如操作 GetSomething 和一个名为 GetSomethingRequestGetSomethingResponse 的对象不能很好地协同工作 - 主要是因为请求和响应被放入自动命名的 SOAP 信封中。如果你的类是使用一些保留字命名的,你可以尝试重命名它们。

异常建议您添加KnownType 属性。当您返回可能是继承类型的实例的基类型时,这通常适用 - 是这种情况吗?您的对象是否涉及继承,并且您是否返回可能是继承类型实例的基类型? (例如A:B,您的操作返回B,但它可能是A

【讨论】:

  • 我按照您的建议逐步完成,绝对帮助我缩小了问题范围。
  • 如果你返回一个字典并且在那个字典中你将有一个A或B的实例,那么KnowTypeAttribute是否必须是KnownType(typeof(A))或@ 987654334@?
  • @tam 我相信您只需要指定需要消歧的已知类型(即 A 或 B)。它总是一个字典,所以字典类型已经包含在合同中。只是 A 和 B 不是具体的。
猜你喜欢
  • 2016-03-21
  • 2020-06-18
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多