【发布时间】:2013-11-21 19:39:05
【问题描述】:
我正在开发一个带有两个类作为 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>>))]
重要的是要说,如果我 SET value 属性为 internal 一切都很好,即使是客户端的 JSON 类,虽然 value 属性从不显示。附上我的一小段代码:
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);
}
我希望你能真正帮助我。感谢您的建议!
【问题讨论】:
-
为什么没有你
[KnownType(typeof(List<Object>))]列出来? -
嗯...你的意思是大写的对象吗?其实我都试过了
标签: c# wcf serialization datacontracts