2009-08-11 12 views
9

Ho una classe astratta. Chiamiamo Lifeform. Sembra qualcosa di simile:Servizio Web ASMX che non serializza la classe base astratta

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

(L'attributo virtuale è dovuto al fatto che sto usando NHibernate, che si lamenta se non sono le proprietà virtuali.)

Ho poi avere una classe che eredita da quella classe Lifeform; lo chiameremo umano. Sembra qualcosa di simile:

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

Tutto molto bello, posso usare le mie classi, umano ottiene i gambe, braccia, e le proprietà vivo quando sto usando. Tranne, quando cerco di creare un servizio web usando la classe Human. L'oggetto serializzato mi fornisce Hat, Age e Name - ma non le proprietà Legs, Arms o Alive.

ho visto una soluzione che suggerisce di utilizzare

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

sulla classe di base (Lifeform), ma che sembra un hack orribile che viola OO. Mettere i collegamenti sulla classe base alle classi che lo ereditano? Eww.

Qualcuno ha incontrato prima questo problema specifico? Hai qualche idea? Fornirò più codice se un esempio più approfondito potrebbe aiutare a descrivere quello che sto facendo di più.

+0

Ho avuto lo stesso problema e questo mi ha aiutato a risolverlo. Ho finito per impostare l'attributo sulla classe invece del metodo restituendolo, comunque. – Guffa

risposta

8

Da quello che ho letto, è possibile includere l'attributo XMLInclude sul metodo web restituendo l'oggetto anziché nella classe base. Ancora non carina, ma potrebbe interessarti un po 'di più che inserire nomi di classi derivati ​​nella classe base. Non l'ho provato, ma penso che tu possa fare qualcosa del genere.

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

Fantastico, grazie. All'inizio non ha funzionato, ma sembra generare il codice corretto, ma non viene visualizzato nel campione. Ho continuato a provarlo e non sembrava funzionare, fino a quando non ho capito "che diamine" e in realtà ho generato gli oggetti serializzati. Bellissimo. Non perfetto, ma hey, è molto meglio che sparare alle mie classi base. Grazie! –

+0

E se volessi passare la classe base come parametro e lanciarla su Human nella funzione GetHuman? Possibile? –

+0

Come faccio ad elencare molti tipi? – Stainedart

0

Eseguito nello stesso identico problema con VB.NET. L'uso dell'attributo XMLInclude, anche se brutto, ha fatto il trucco.

+0

Non sorprende che lo stesso problema si verifichi con VB.NET, poiché si tratta di un problema .NET, non di un problema C#. –

Problemi correlati