我正在开发一个带有两个类作为DataContracts的WCF。其中一个是我自己开发的数据结构,它将对象管理为JSON,它命名为 JSON ;另一个只是我的WebService接收的自定义对象,它命名为 Emission 。我有三种方法;一个用于创建策略,另一个用于检索策略,最后一个使用JSON类以动态方式查询目录。我的问题出现在这样的错误消息中:
“格式化程序在尝试反序列化消息时抛出异常:尝试反序列化时出错
参数... InnerException消息是'第1行位置错误823.元素...
包含的数据
'http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfanyType'
数据合同。反序列化器不知道映射到此合同的任何类型。
将与“ArrayOfanyType”对应的类型添加到已知类型列表中 - 例如,
通过使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表。'。
有关更多详细信息,请参阅InnerException。“
我正在寻找答案然后我注意到我的问题的原因是我的JSON类中的一个属性,它是一个通用对象列表。我需要在我的客户端中使用此属性来初始化我希望收到的对象,因此该列表可能包含字符串或另一个对象列表,这就是我需要这种项目的原因。
我尝试使用某种KnownTypes但没有成功,但我不知道我做错了什么
[KnownType(typeof(Object[]))]
[KnownType(typeof(List<List<Object>>))]
[KnownType(typeof(List<object>))]
[KnownType(typeof(List<string>))]
[KnownType(typeof(List<List<string>>))]
重要的是,如果我设置 值属性为内部,即使,客户端的所有内容都可以正常使用JSON类永远不会显示值属性。附上一堆我的代码:
public class JSON
{
#region
[DataMember]
public List<Object> value { get; set; } This cause the problem
//public List<Object> value { get; internal set; } This allow everything happens fine
[DataMember]
public List<string> errors { get; set; }
[DataMember]
public Regex pattern { get; internal set; }
[DataMember]
internal Regex commaPattern { get; private set; }
#endregion
}
[ServiceContract(Namespace = "http://EmissionService")]
public interface IEmissionService
{
[OperationContract]
[WebGet(UriTemplate = "Emissions/getCatalog", ResponseFormat = WebMessageFormat.Json)]
string getCatalog(JSON request);
[OperationContract]
[WebInvoke(UriTemplate = "Emissions/createPolicy", ResponseFormat = WebMessageFormat.Json, Method = "POST")]
string createPolicy(Emission emissionRequest);
[OperationContract]
[WebGet(UriTemplate = "Emissions/getPolicy", ResponseFormat = WebMessageFormat.Json)]
JSON getPolicy(JSON request);
}
我希望你能真正帮助我。谢谢你的建议!
答案 0 :(得分:0)
可能的回合可能是使用数组而不是数据合同中的列表,并在您的服务中正确使用ToArray()
和ToList()
。
答案 1 :(得分:0)
编译器必须知道对象列表可以包含的所有类型才能使反序列化生效。