2009-08-11 22 views
9

Tengo una clase abstracta. Vamos a llamarlo Lifeform. Se ve algo como:Servicio web ASMX que no serializa clase base abstracta

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

(El atributo virtual es debido al hecho de que estoy usando NHibernate, que se queja si no son propiedades virtuales.)

entonces tengo una clase que hereda de esa clase Lifeform; lo llamaremos Humano. Se ve algo como:

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

Todo es precioso, puedo usar mis clases, Human pone las piernas, los brazos y las propiedades vivo cuando lo estoy usando. Excepto, es decir, cuando intento hacer un servicio web usando la clase humana. El objeto serializado me otorga Sombrero, Edad y Nombre, pero no propiedades de Piernas, Armas o Vivas.

he visto una solución que sugiere el uso

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

En la clase base (de forma de vida), pero que parece como un horrible truco que viole OO. Poniendo enlaces en la clase base a las clases que lo heredan? Eww.

¿Alguien se ha encontrado con este problema específico antes? ¿Tienes alguna idea? Proporcionaré más código si un ejemplo más profundo ayudaría a describir lo que estoy haciendo más.

+0

Tuve el mismo problema, y ​​esto me ayudó a resolverlo. Sin embargo, terminé configurando el atributo en la clase en lugar del método para devolverlo. – Guffa

Respuesta

8

Según lo que he leído, puede incluir el atributo XMLInclude en el método web que devuelve el objeto en lugar de la clase base. Todavía no es bonito, pero podría atraer un poco más que poner nombres de clase derivados en la clase base. No lo probé, pero creo que puedes hacer algo como esto.

[WebMethod] 
[XmlInclude(typeof(LifeForm))] 
public Human GetHuman() 
{ 
    return new Human(); 
} 
+0

Impresionante, gracias. Al principio no funcionó, pero parece generar el código correcto, simplemente no se muestra en la muestra. Seguí intentándolo y no pareció funcionar, hasta que pensé "qué diablos" y realmente generé los objetos serializados. Hermosa. No es perfecto, pero bueno, es mucho mejor que criticar mis clases base. ¡Gracias! –

+0

¿Qué tal si quisieras pasar la clase base como parámetro y convertirla en Humano en la función GetHuman? ¿Posible? –

+0

¿Cómo voy a enumerar muchos tipos? – Stainedart

0

Se metió en el mismo problema exacto con VB.NET. Usar el atributo XMLInclude, aunque feo, hizo el truco.

+0

No es sorprendente que ocurra el mismo problema con VB.NET, ya que es un problema de .NET, no un problema de C#. –

Cuestiones relacionadas