WCF DataContract с абстрактным массивом DataMember - PullRequest
1 голос
/ 11 ноября 2009

Я не могу заставить этот сценарий работать. Вот образец -

[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 Ответ

1 голос
/ 11 ноября 2009

Если у вас есть определение объекта BaseT, помеченное как KnownType и в нем указан ChildT, оно будет работать с абстрактной основой (я делаю это все время). Ваша проблема в том, что ковариация массива не разрешена в C #, поэтому вы не можете привести BaseT [] к ChildT []. Преобразование отдельных элементов в ChildT будет работать, хотя вы можете увидеть это, проверив массив в отладчике, если вам нужен ChildT [], и LINQ сделает за вас всю работу (например, baseArray.Cast (). ToArray () ).

...