【问题标题】:Property of type List<Object> in DataContract class failsDataContract 类中 List<Object> 类型的属性失败
【发布时间】: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&lt;Object&gt;))] 列出来?
  • 嗯...你的意思是大写的对象吗?其实我都试过了

标签: c# wcf serialization datacontracts


【解决方案1】:

在您的数据合同中使用数组而不是列表,并在您的服务中适当地使用ToArray()ToList() 是一种可能的环绕方式。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2018-04-02
      • 2021-12-30
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2021-07-27
      • 2018-11-11
      相关资源
      最近更新 更多