WCF - 添加到[DataMember] List <baseclass>的子类导致异常</baseclass>

时间:2009-08-03 03:53:47

标签: wcf exception serialization subclass datamember

我的一个[DataContract]类包含一个[DataMember],它是一个List。 BaseClass有几个不同的子类。

每当该List包含任何子类的实例时,在服务返回请求通道期间/之后发生异常。如果List不包含任何子类,则可以正常工作。

这是我的代码示例(它本身不起作用):

public class BaseClass
{
}
public class BaseClassSub : BaseClass
{
}

[DataContract]
public class MyClass
{
    List<BaseClass> m_Classes = new List<BaseClass>();

    [DataMember]
    public List<BaseClass> Classes
    {
        get { return m_Classes; }
        set { m_Classes = value; }
    }
}


[ServiceContract]
public interface IMyService
{
    [OperationContract]
    MyClass GetMyClass();   

}

public class MyService : IMyService
{
    public MyClass GetMyClass()
    {
        MyClass o = new MyClass();

        //THIS WORKS!!!!
        //o.Classes = new List<BaseClass>() { new BaseClass() };

        //THIS DOES NOT WORK!!!!
        o.Classes = new List<BaseClass>() { new BaseClassSub() };

        return o;
    }
}

调试时出现以下错误:

套接字连接已中止。这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为'00:00:59.6560000'。

任何人都知道如何解决这个问题(让它来处理子类)?

3 个答案:

答案 0 :(得分:4)

您需要告诉Data Contract Serializer它可能遇到的类型。请参阅Data Contract Known Types

答案 1 :(得分:0)

经过更多的搜索,我继续在BaseClass上添加[KnownType]属性(见下文),现在它正在运行。

[KnownType(typeof(BaseClassSub))]
public class BaseClass
{
}

我希望这至少可以帮助别人!

答案 2 :(得分:0)

DataContrat反序列化不调用构造函数,并且未分配成员的初始值

这意味着反序列化后m_Classes将为null。请确保通过OnDeserialize事件或在getter中创建列表来在代码中覆盖它。