Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 如何传递包含项目字典的项目字典?_Wcf_Silverlight 4.0_Datacontractserializer - Fatal编程技术网

Wcf 如何传递包含项目字典的项目字典?

Wcf 如何传递包含项目字典的项目字典?,wcf,silverlight-4.0,datacontractserializer,Wcf,Silverlight 4.0,Datacontractserializer,我有一个服务,我正试图通过它传递一个对象字典。一切都很好,直到我添加了一个对象字典,其中包含了另一个对象的字典。在下面的示例中,导致问题的字典将是A类 //example public class A { public Dictionary<string,B> BValues { get; set; } } public class B { public Dictionary<string, C> C

我有一个服务,我正试图通过它传递一个对象字典。一切都很好,直到我添加了一个对象字典,其中包含了另一个对象的字典。在下面的示例中,导致问题的字典将是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;
    }
//示例
公共A类
{
公共字典b值{get;set;}
}
公共B级
{
公共字典C值{get;set;}
}
公共C类
{
int x;
int-y;
}
我已尝试在我的服务中创建字典knowntypes,并确保其他类标记为数据协定,它们的属性标记为DataMember属性。我不知道我还需要做些什么,甚至可以做些什么才能让这一切顺利进行

编辑

例外情况:

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


为了找出失败的地方,我设置了一个简单的WCF服务,它返回一个非常基本的嵌套
字典
,它可以很好地处理添加到其中的许多项

    [OperationContract]
    Dictionary<int, Dictionary<int, int>> GetDictionary();
[运营合同]
字典GetDictionary();
基于此,我假设这是您的对象的问题(可能是因为它们位于
字典
集合中)。我建议你做一些测试来缩小你的问题范围

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

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


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

有什么问题?您得到的是序列化异常,还是只是空属性?需要更多信息。所有内容都可以正常生成和更新。当我正在运行并且它实际尝试序列化要发送到客户端的对象时,它收到序列化异常。异常为:元素“”包含“”数据协定的数据。反序列化程序不知道映射到此协定的任何类型。将与“ArrayOfKeyValueOfstringClassValuesNSpYOWsW”相对应的类型添加到已知类型列表中-例如,使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中。“。有一点我不确定,它以这种方式在xsd中创建信息,名称的尾端有乱码,不确定是否有问题,但这可能是我沮丧的根源?我按照你的建议进行了处理,确实帮助我缩小了问题的范围。对于已知类型,如果您返回一个字典,并且在该字典中您将有一个a或B的实例,那么KnowTypeAttribute是否必须用于
KnownType(typeof(a))
KnownType(typeof(dictionary))
?@tam我相信您只需要指定需要消除歧义的已知类型(即A或B)。它总是一个字典,所以字典类型已经包含在合同中了。只是A&B不是具体的。