DataContract类中List <object>类型的属性失败</object>

时间:2013-11-21 19:39:06

标签: c# wcf serialization datacontracts

我正在开发一个带有两个类作为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);
}

我希望你能真正帮助我。谢谢你的建议!

2 个答案:

答案 0 :(得分:0)

可能的回合可能是使用数组而不是数据合同中的列表,并在您的服务中正确使用ToArray()ToList()

答案 1 :(得分:0)

编译器必须知道对象列表可以包含的所有类型才能使反序列化生效。