Используя WCF с абстрактными классами

Как я определяю 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; }
}
21
задан AlexFoxGill 18 May 2015 в 15:55
поделиться

2 ответа

Я разобрался. Вам необходимо указать подклассы абстрактного базового класса с помощью KnownType. Решением было бы добавить это в класс Foo:

[DataContract]
[KnownType(typeof(Bar))] // <------ added
public abstract class Foo
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string BaseText { get; set; }
}

Посмотрите эту ссылку .

33
ответ дан 29 November 2019 в 20:59
поделиться

Интересно.

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

2
ответ дан 29 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: