Веб-сервис ASMX не сериализует абстрактный базовый класс - PullRequest
9 голосов
/ 11 августа 2009

У меня есть абстрактный класс. Давайте назовем это Lifeform. Это выглядит примерно так:

public abstract class Lifeform {
    public virtual int Legs { get; set; }
    public virtual int Arms { get; set; }
    public virtual bool Alive { get; set; }
}

(Виртуальный атрибут связан с тем, что я использую nHibernate, который жалуется, если это не виртуальные свойства.)

У меня тогда есть класс, который наследуется от этого класса Lifeform; мы будем называть это человеком. Это выглядит примерно так:

public class Human: Lifeform {
    public virtual bool Hat { get; set; }
    public virtual int Age { get; set; }
    public virtual string Name { get; set; }
}

Все прекрасно, я могу использовать свои классы, Человек получает свойства Legs, Arms и Alive, когда я его использую. За исключением случаев, когда я пытаюсь создать веб-сервис с использованием класса Human. Сериализованный объект дает мне Hat, Age и Name, но не имеет свойств Legs, Arms или Alive.

Я видел обходной путь, который предлагает использовать

[System.Xml.Serialization.XmlInclude(typeof(Human))]

На базовом классе (Lifeform), но это похоже на ужасный хак, который нарушает ОО. Положить ссылки на базовый класс на классы, которые его наследуют? Eww.

Кто-нибудь сталкивался с этой конкретной проблемой раньше? Есть идеи? Я предоставлю больше кода, если более подробный пример поможет описать, что я делаю больше.

Ответы [ 2 ]

9 голосов
/ 11 августа 2009

Из того, что я прочитал, вы можете включить атрибут XMLInclude в веб-метод, возвращающий объект, а не в базовый класс. Все еще не красиво, но может обратиться к вам немного больше, чем поместить имена производных классов в базовый класс. Я не пробовал это, но я думаю, что вы можете сделать что-то вроде этого.

[WebMethod]
[XmlInclude(typeof(LifeForm))]
public Human GetHuman()
{
   return new Human();
}
0 голосов
/ 11 августа 2009

С такой же проблемой столкнулся VB.NET. Использование атрибута XMLInclude, хотя и некрасиво, добилось цели

...