У меня есть следующие классы...
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]
для каждого из них в контракте на обслуживание, но ничего не помогает.
Я прочитал бесчисленное количество ответов на один и тот же вопрос, но не нашел ничего подходящего. Мои сервисы возвращают другие пользовательские классы, и все они сериализуются без проблем.
Кто-нибудь может объяснить, в чем здесь проблема? Пожалуйста, дайте мне знать, если я не предоставил достаточно информации.