【发布时间】: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();
}
SubClass1 和 SubClass2 继承自 UpperClass。实际上,它们只共享一个名为update() 的方法,该方法仅在内部使用(不是DataMember)。以下代码展示了SubClass1和SubClass2的实现:
[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类型的对象,它有两个变量:val1和val2。相反,它似乎是UpperClass类型,它没有val1和val2这两个变量。但是当我写SubClass1 DatSet = proxy.init("SubClass1");时,我得到一个类型转换异常。我的客户如何使用val1和val2这两个变量? -
但这就是将它放入 UpperClass 引用的重点,不是吗?我认为您的困惑源于 OOP 概念,与 WCF 无关。在没有代理的情况下尝试直接实例化类,我想你会遇到同样的问题。