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