2011-01-05 3 views
2

У меня есть следующие настройки двух классов:WCF и Наследование объекта

[SerializableAttribute] 
public class ParentData{ 
    [DataMember] 
    public string Title{get;set;} 
} 

[DataContract] 
public class ChildData : ParentData{ 
    [DataMember] 
    public string Abstract{get;set;} 
} 

Эти два класса подаются через службу WCF. Однако я хочу, чтобы служба открывала класс ChildData для конечного пользователя, но вытащила выделенные свойства DataMember из родителя. Например. Потребляя клиент будет иметь класс заглушки, который был похож:

public class ChildData{ 
    public string Title{get;set;} 
    public string Abstract{get;set;} 
} 

Если я использую родительские и дочерние классы, как описаны выше класс заглушки содержит только абстрактные свойства.

Я посмотрел на использование атрибута KnownType на классе ChildData так:

[DataContract] 
[KnownType(typeOf(ParentData)] 
public class ChildData : ParentData{ 
    [DataMember] 
    public string Abstract{get;set;} 
} 

Однако это не сработало.

Затем я применил атрибут DataContract к классу ParentData, однако затем он создает два класса-заглушки в клиентском приложении, которые я не хочу.

Есть ли способ сказать сериалайзер, что она должна сглаживаться наследство, что и суб-класса т.е. ChildData

+0

Возможный дубликат [Есть ли способ скрыть/свернуть базовые типы в контрактах данных службы WCF?] (Http://stackoverflow.com/questions/3499788/is-there-any-way-to-hide-flatten -base-types-in-wcf-service-data-контракты) –

ответ

1

Я считаю, что ваш ParentData класс также должен иметь атрибут [DataContract]:

[DataContract] 
public class ParentData 
{ 
    [DataMember] 
    public string Title{get;set;} 
} 

[Serializable] не помогает с WCF с использованием сериализатора данных по умолчанию.

+0

Проблема с добавлением атрибута [DataContract] в классе ParentData заключается в том, что клиент-потребитель создаст два класса-заглушки, которые представляют цепочку наследования, это то, что я хочу избегать. Чтобы обойти это, я могу заставить свой проект двигаться, чтобы превратить класс ParentData в интерфейс. Это не идеально, но будет работать пока. –

0

Я считаю, что ваш класс ParentData должен быть отмечен абстрактным, а также должен иметь атрибут [DataContract]:

[DataContract] 
public abstract class ParentData 
{ 
    [DataMember] 
    public string Title{get;set;} 
} 

Как сказал Марк, то [Serializable] не помогает с WCF с использованием данных по умолчанию контрактный сериализатор.

Смежные вопросы