4

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

只要该列表包含任何子类的实例,就会在服务返回请求通道期间/之后发生异常。如果列表不包含任何子类,它工作正常。

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

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”。

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

4

3 回答 3

4

您需要告诉 Data Contract Serializer 它可能遇到的类型。请参阅数据协定已知类型

于 2009-08-03T04:03:03.527 回答
0

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

这意味着反序列化后 m_Classes 将为空。确保通过 OnDeserialize 事件或在 getter 中创建列表在代码中涵盖这一点。

于 2009-12-28T18:11:40.730 回答
0

经过更多搜索,我继续在 BaseClass 上放置了一个 [KnownType] 属性(见下文),它现在可以工作了。

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

我希望这至少对其他人有帮助!

于 2009-08-03T04:08:16.247 回答