Использование WCF с абстрактными классами
Как определить DataContract для абстрактных классов в WCF?
У меня есть класс "Человек", с которым я успешно общаюсь с использованием WCF. Теперь я добавляю новый класс "Foo", на который ссылается Person. Все по-прежнему хорошо. Но когда я делаю абстракцию Foo и определяю подкласс, вместо этого он терпит неудачу. Он не работает на стороне сервера с CommunicationException, но это на самом деле не говорит мне многого.
Мои упрощенные классы для тестирования:
[DataContract]
public class Person
{
public Person()
{
SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" };
}
[DataMember]
public int Id { get; set; }
[DataMember]
public Foo SomeFoo { get; set; }
}
[DataContract]
public abstract class Foo
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string BaseText { get; set; }
}
[DataContract]
public class Bar : Foo
{
[DataMember]
public string SubText { get; set; }
}
Ответы
Ответ 1
Я понял это. Вы должны указать подклассы в абстрактном базовом классе, используя "KnownType". Решение было бы добавить это в класс Foo:
[DataContract]
[KnownType(typeof(Bar))] // <------ added
public abstract class Foo
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string BaseText { get; set; }
}
Отметьте эту ссылку.
Ответ 2
Интересно.
Я ожидаю, что этот код завершится с ошибкой в конструкторе Person
, поскольку вы не можете напрямую создать экземпляр абстрактного класса.