带有抽象DataMember数组的WCF DataContract

时间:2009-11-10 23:19:05

标签: wcf inheritance serialization abstract datacontract

我不能让这个场景奏效。这是模式 -

[DataContract]
/*abstract*/ class BaseT
{ ... }

[DataContract]
class ChildT : BaseT
{ ... }

[DataContract]
class MessageContents
{
    [DataMember]
    public BaseT[] XX; // Array of BaseT objects. I need WCF to somehow figure out that they're actually ChildT.
}

// ...receive a webHttp request of type MessageContents...

// cast to use MessageContents.XX as a ChildT[] instead of a BaseT[]
ConcreteClass[] QQ = (ConcreteClass[])request.xx;

我尝试使用KnownType或KnownServiceType注释几乎所有内容都无济于事。

如果我将BaseT抽象化,我得到一个反序列化错误'不能实例抽象类'。如果我使BaseT具体化,我没有得到反序列化错误。相反,当我将它转换为ChildT时,我“无法将'BaseT []'类型的对象转换为'ChildT []'”。

1 个答案:

答案 0 :(得分:1)

如果您使用KnownType标记了BaseT对象定义并在那里列出了ChildT,那么它将适用于抽象基础(我一直这样做)。您的问题是C#中不允许使用数组协方差,因此您无法将BaseT []强制转换为ChildT []。将各个元素转换为ChildT会起作用,但是如果你在调试器中检查数组,你可以看到这个 - 如果你需要一个ChildT []让LINQ为你做的工作(例如,baseArray.Cast()。ToArray() )。