Nano Hash - криптовалюты, майнинг, программирование

SerializationException при возврате пользовательских классов из службы WCF

У меня есть следующие классы...

public abstract class Fallible<T> {
}

public class Success<T> : Fallible<T> {
  public Success(T value) {
    Value = value;
  }

  public T Value { get; private set; }
}

Предысторию этого можно найти в предыдущий мой вопрос, но вам не нужно читать этот пост, так как приведенные выше классы - это все, что нужно, чтобы увидеть проблему.

Если у меня есть упрощенный вызов службы WCF, подобный этому...

[OperationContract]
public Fallible<Patient> GetPatient(int id) {
  return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"});
}

... затем, когда я пытаюсь вызвать службу из приложения WPF, которое ее использует (или тестового клиента WCF), я получаю исключение CommunicationException...

Произошла ошибка при попытке сериализации параметра :GetPatientResult. Сообщение InnerException было "Тип" PhysioDiary.Entities.FallibleClasses.Success`1[[PhysioDiary.Entities.Patient, PhysioDiary.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' с именем контракта данных > ' SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' не ожидается. Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer или добавляете какие-либо типы, неизвестные статически, в список известных типов, например, используя атрибут KnownTypeAttribute или добавляя их в список известных типов, передаваемых сериализатору.'. Пожалуйста, смотрите InnerException для более подробной информации.

...за внутренним SerializationException исключением...

Введите «PhysioDiary.Entities.FallibleClasses.Success`1[[PhysioDiary.Entities.Patient, PhysioDiary.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]» с именем контракта данных > «SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' не ожидается. Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer или добавляете любые типы, неизвестные статически, в список известных типов, например, используя атрибут KnownTypeAttribute или добавляя их в список известных типов, передаваемых сериализатору.

Я пытался добавить [DataContract] к классу и [DataMember] к каждому свойству, а также добавить атрибут [KnownType] для всех четырех задействованных классов и добавить [ServiceKnownType] для каждого из них в контракте на обслуживание, но ничего не помогает.

Я прочитал бесчисленное количество ответов на один и тот же вопрос, но не нашел ничего подходящего. Мои сервисы возвращают другие пользовательские классы, и все они сериализуются без проблем.

Кто-нибудь может объяснить, в чем здесь проблема? Пожалуйста, дайте мне знать, если я не предоставил достаточно информации.


Ответы:


1

Оказывается, все, что мне нужно было сделать, это украсить метод службы атрибутами [ServiceKnownType] для базового типа и каждого производного типа...

[OperationContract]
[ServiceKnownType(typeof(Fallible<Patient>)]
[ServiceKnownType(typeof(Success<Patient>)]
[ServiceKnownType(typeof(BadIdea<Patient>)]
[ServiceKnownType(typeof(Failure<Patient>)]
public Fallible<Patient> GetPatient(int id) {
  return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"});
}

Хотя добавление четырех атрибутов к каждому вызову утомительно, это работает. Я хотел бы знать, есть ли способ объединить их в один атрибут, но, по крайней мере, теперь у меня есть работающий сервис.

Надеюсь, это кому-то поможет.

02.02.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..