Подтвердить что ты не робот

Использование 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; }
}
4b9b3361

Ответ 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, поскольку вы не можете напрямую создать экземпляр абстрактного класса.