Использование WCF с абстрактными классами - PullRequest
21 голосов
/ 23 июня 2010

Как определить DataContract для абстрактных классов в WCF?

У меня есть класс "Person", с которым я успешно общаюсь с помощью 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; }
}

Ответы [ 2 ]

33 голосов
/ 23 июня 2010

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

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

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

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

2 голосов
/ 23 июня 2010

Интересно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...