我有一个带有属性的简单对象(我有更多的属性,简单的int和字符串);
[DataMember]
public virtual IList<MailAddress> DistributionList { get; set; }
我使用NHibernate读取了这个对象,导致属性类型为NHibernat。收集通用的持久通用列表。
在查看WCF日志时,我得到以下错误;
尝试序列化参数时出错http://tempuri.org/:StartReportDistributionResult.InnerException消息为
键入"Miros"。模型。MailAddress',数据协定名称为'MailAddress:http://schemas.datacontract.org/2004/07/Miros.Models不应为"。如果您正在使用DataContractSerializer或将任何未知类型静态添加到已知类型列表中,请考虑使用DataContractResolver,例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表。'。有关详细信息,请参阅InnerException。
现在,这应该表明序列化有问题。因此,我添加了通过DataContractSerializer测试对象的代码,从这个问题开始,有人创建了DataContract测试工具吗?。这很好。。。
现在,如果我更改属性;
myObject.DistributionList = myObject.DistributionList.ToList();
WCF很高兴。这是怎么回事?我怎样才能知道问题出在哪里。
这可能是由于DataMember的类型为IList。请尝试将其更改为具体类List。
我发现在WCF协定中使用通用接口类型数据成员有点问题,特别是如果接口成员未正确初始化或延迟加载,我记得使用IEnumerable类型数据成员进行WCF序列化时也遇到过类似的序列化问题。