BindingList <t>作为DataMember </t>

时间:2012-10-17 23:43:45

标签: .net wcf datacontractserializer

我有一个我想通过WCF服务(Net TCP Binding)发送的CLR类。客户端和服务器都使用相同的数据类和服务接口。没有生成存根。以下是两个类的基本部分:

[DataContract]
public class ContainerClass
{
    //some primitive data with [DataMember] ...

    [DataMember] /**/
    public virtual BindingList<ItemClass> Items{ get; private set; }
}

[DataContract]
public class ItemClass
{
    //some primitive data with [DataMember] ...

    public ContainerClass Parent { get; set; } // (no [DataMember])
}

如果我忽略[DataMember]的{​​{1}}属性(标有BindingList),则会正确传输数据。当然,没有项目。

只要添加/**/,对service方法的调用就会失败,并返回类型为[DataMember]的对象,并显示以下错误消息:

  

服务器未提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。

合同不匹配是不可能的。可能存在内部服务器错误,我未收到通知。

如何解决此问题并让服务器将项目发送到客户端?

1 个答案:

答案 0 :(得分:1)

很可能BindingList<>无法序列化。要获得更详细的错误,您需要启用跟踪。请参阅this post了解如何操作。

在DTO中使用复杂的集合类通常不是一个好主意。相反,请考虑数组/列表,您始终可以在客户端重构BindingList<>