WCF - сериализация наследованных типов

У меня есть эти классы:

[DataContract]
public class ErrorBase {}

[DataContract]
public class FileMissingError: ErrorBase {}

[DataContract]
public class ResponseFileInquiry
{
  [DataMember]
  public List<ErrorBase> errors {get;set;};
}

Экземпляр класса, ResponseFileInquiry - то, что мой сервисный метод возвращает клиенту. Теперь, если я заполняю ResponseFileInquiry.errors экземплярами ErrorBase, все хорошо работает, но если я добавляю экземпляр наследованного типа FileMissingError, я получаю сервисное исключение стороны во время сериализации:

Type 'MyNamespace.FileMissingError' with data contract name 'FileMissingError' 
is not expected. Add any types not known statically to the list of known types - 
for example, by using the KnownTypeAttribute attribute or by adding them to the 
list of known types passed to DataContractSerializer.'

Таким образом, сериализатор запутывается, потому что он ожидает, что Список будет содержать заявленные текстовые объекты (ErrorBase), но это получает наследованный тип (FileMissingError) объекты.

У меня есть целый набор ошибочных типов, и Список будет содержать комбинации их, поэтому что я могу сделать, чтобы заставить его работать?

15
задан Cœur 4 April 2018 в 06:33
поделиться

2 ответа

Вы должны добавить атрибут KnownType в свой базовый класс

[DataContract]
[KnownType(typeof(FileMissingError))]
public class ErrorBase {}

Подробнее об атрибуте KnownType в этом блоге

17
ответ дан 1 December 2019 в 02:46
поделиться

Попробуйте следующее:

[DataContract]
[KnownType(typeof(FileMissingError))]
public class ErrorBase {}

Как указано в сообщении об ошибке, любая информация, которую нельзя узнать статически (например, полиморфные отношения, которые вы здесь выразили), должна предоставляться через атрибуты. В этом случае вам необходимо указать, что ваш контракт данных FileMissingError является известным типом своего базового класса ErrorBase .

7
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: