Десериализация абстрактного класса - PullRequest
5 голосов
/ 11 марта 2009

У меня есть абстрактный класс «Сервер», который я создаю в своем JavaScript в своем пользовательском интерфейсе, а затем я хочу, чтобы в моей веб-службе был метод, который выполняет следующие действия:

public List<Database> GetDatabases(Server server)
{
    Type type = server.GetType();
    Server x = null;

    if (typeof (SqlServer2005Server).Equals(type))
    {
        x = new SqlServer2005Server();
    }

    // Return the Databases from the server
    return x.GetDatabases();
}

Проблема, с которой я сталкиваюсь, заключается в том, что сервер не может быть десериализован, поскольку он является абстрактным. Нужно ли иметь метод для каждого сервера, который у меня есть, который наследуется от конкретного типа, т.е.

public List<Database> GetDatabases(SqlServer2005Server server)
{
    // Return the Databases from the server
    return SqlServer2005Serverx.GetDatabases();
}

public List<Database> GetDatabases(OracleServer server)
{
    // Return the Databases from the server
    return SqlServer2005Serverx.GetDatabases();
}

Я был бы очень признателен за вашу помощь, так как не уверен, что это лучшее решение

Точная ошибка, которую я получаю:

Экземпляры абстрактных классов не могут быть созданы.

1 Ответ

9 голосов
/ 11 марта 2009

WCF будет поддерживать наследование, но вы должны украсить свой контракт данных с помощью известного типа attibute. Например:

[DataContract]
[KnownType(typeof(Customer))]
class Contact
{
   [DataMember]
   public string FirstName
   {get;set;}

   [DataMember]
   public string LastName
   {get;set;}
}
[DataContract]
class Customer : Contact
{
   [DataMember]
   public int OrderNumber
   {get;set;}
}

НТН.

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