【问题标题】:WCF - Sub-class added to a [DataMember] List<BaseClass> causes exceptionWCF - 添加到 [DataMember] List<BaseClass> 的子类导致异常
【发布时间】:2009-08-03 03:53:47
【问题描述】:

我的一个 [DataContract] 类包含一个 [DataMember],它是一个列表。 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”。

有谁知道如何解决这个问题(让它处理子类)?

【问题讨论】:

  • 请不要让我们猜测异常。发布整个异常。抓住它,然后发布 ex.ToString()。

标签: wcf exception serialization subclass datamember


【解决方案1】:

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

【讨论】:

  • 谢谢!我只是在发帖时错过了您的回复!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-25
      • 2018-09-22
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多