У меня есть абстрактный класс. Давайте назовем это 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.
Кто-нибудь сталкивался с этой конкретной проблемой раньше? Есть идеи? Я предоставлю больше кода, если более подробный пример поможет описать, что я делаю больше.