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