繁体   English   中英

类型列表的属性 <Object> 在DataContract类中失败

[英]Property of type List<Object> in DataContract class fails

我正在开发带有两个类的WCF作为DataContracts。 其中之一是我自己开发的数据结构,该数据结构将对象作为JSON管理,其名称为JSON 另一个只是我的WebService收到的Customized Object,它名为Emission 我有三种方法; 一个用于创建策略,另一个用于检索策略,最后一个使用JSON类以动态方式查询目录。 我的问题来自这样的错误消息:

“格式化程序尝试对消息进行反序列化时引发了异常:尝试对参数进行反序列化时发生了错误... InnerException消息为'第1行位置823错误。元素...包含' http://的数据schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfanyType '数据协定。解串器不知道任何映射到该协定的类型。将与'ArrayOfanyType'对应的类型添加到已知类型的列表中-例如,使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型列表中。”。
有关更多详细信息,请参阅InnerException。”

我一直在寻找答案,然后发现问题的原因是我的JSON类中的一个属性,该属性是通用对象的列表。 我需要在客户端中使用此属性来初始化我希望接收的对象,因此此列表可能包含字符串或其他对象列表,这就是为什么我需要这种项目的原因。

我尝试使用某种KnownType,但没有成功,但是我不知道自己做错了什么

[KnownType(typeof(Object[]))]
[KnownType(typeof(List<List<Object>>))]
[KnownType(typeof(List<object>))]
[KnownType(typeof(List<string>))]
[KnownType(typeof(List<List<string>>))] 

重要的是要说,如果我将value属性设置内部 ,即使从未显示过value属性,即使客户端中的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);
}

希望您能对我有所帮助。 感谢您的建议!

可能的回绕可能是在数据协定中使用数组而不是列表,并在服务中适当地使用ToArray()ToList()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM