WCF и наследование объектов - PullRequest
2 голосов
/ 05 января 2011

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

[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;}
}

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 05 января 2011

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

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

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

0 голосов
/ 05 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...