【问题标题】:WCF: How to use an abstract class as DataContractWCF:如何将抽象类用作 DataContract
【发布时间】:2014-06-17 13:54:08
【问题描述】:

我想使用一个抽象类将其定义为 WCF 的 DataContract。下面的例子展示了我如何定义我的抽象类UpperClass

[DataContract(IsReference = true)]
[KnownType(typeof(SubClass1))]
[KnownType(typeof(SubClass2))]
abstract public class UpperClass
{
    abstract public void update();
}

SubClass1SubClass2 继承自 UpperClass。实际上,它们只共享一个名为update() 的方法,该方法仅在内部使用(不是DataMember)。以下代码展示了SubClass1SubClass2的实现:

[DataContract]
public class SubClass1 : UpperClass
{
    private int[] _val1;
    private int[] _val2;

    //internal constructor:
    public SubClass1()
    {
        _val1 = new int[2];
        _val2 = new int[2];

        //initialize values of _val1 and _val2 ...
    }

    //internal update method
    public override void update()
    {
        //here comes update formulas...
    }

    //enable simple access from WCF client:
    [DataMember]
    public int[] val1
    {
        get { return _val1; }
        set { _val1 = value; }
    }

    [DataMember]
    public int[] val2
    {
        get { return _val2; }
        set { _val2 = value; }
    }
}





[DataContract]
public class SubClass2 : UpperClass
{
    private int[] _value1;
    private int[] _value2;

    //internal constructor:
    public SubClass2()
    {
        _value1 = new int[12];
        _value2 = new int[12];
    }

    // ...

在服务器端,我使用以下代码提供我的服务,该代码在其接口类中定义为 [OperationContract(IsInitiating = true, IsTerminating = false)]。

public UpperClass init(string s)
{
    if (s.Equals("SubClass1"))
        obj = new SubClass1();
    else if (s.Equals("SubClass2"))
        obj = new SubClass2();

    return obj;
}

在客户端,我使用(或初始化)我的服务:

UpperClass DatSet = proxy.init("SubClass1");

当我调试到这行末尾时,DatSet 的内容看起来很奇怪:

{MyExternalLayer.IMyProcessingLayer_proxy.SubClass1} [MyExternalLayer.IMyProcessingLayer_proxy.SubClass1]:{MyExternalLayer.IMyProcessingLayer_proxy.SubClass1} 扩展数据:{System.Runtime.Serialization.ExtensionDataObject} extensionDataField:{System.Runtime.Serialization.ExtensionDataObject} 属性更改:空

【问题讨论】:

  • 异常信息是什么意思?
  • 不知何故我摆脱了异常。对不起,但我不知道为什么。但是,我的变量DatSet 有非常奇怪的内容。对SubClass1 的反序列化似乎不像我预期的那样工作。
  • 对我来说看起来很正常。也许你可以解释一下你的期望?
  • 我希望DatSet 成为SubClass1 类型的对象,它有两个变量:val1val2。相反,它似乎是UpperClass 类型,它没有val1val2 这两个变量。但是当我写SubClass1 DatSet = proxy.init("SubClass1"); 时,我得到一个类型转换异常。我的客户如何使用val1val2 这两个变量?
  • 但这就是将它放入 UpperClass 引用的重点,不是吗?我认为您的困惑源于 OOP 概念,与 WCF 无关。在没有代理的情况下尝试直接实例化类,我想你会遇到同样的问题。

标签: c# wcf


【解决方案1】:

我将您的数据合同粘贴到 WCF 服务中,它们工作得很好,尽管我不建议在您的数据合同中包含业务逻辑(抽象公共无效更新();)并超越服务边界。但这只是一种意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多