2009-08-11 2 views
9

Ich habe eine abstrakte Klasse. Nennen wir es Lebensform. Es sieht so etwas wie:ASMX Web Service nicht serialisiert abstrakte Basisklasse

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

(Das virtuelle Attribut auf die Tatsache zurückzuführen ist, dass ich mit nHibernate, die jammert, wenn sie nicht virtuellen Eigenschaften sind.)

ich dann eine Klasse, die erbt aus dieser Lebensformklasse; wir werden es menschlich nennen. Es sieht so etwas wie:

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

Alles ist schön, kann ich meine Klassen verwenden, Mensch bekommt die Beine, Arme und Lebend-Eigenschaften, wenn ich es bin mit. Außer, wenn ich versuche, einen Webservice mit der Klasse Mensch zu erstellen. Das serialisierte Objekt gibt mir Hut, Alter und Name - aber keine Legs, Arme oder Lebendigen Eigenschaften.

Ich habe eine Abhilfe gesehen, die

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

Auf der Basisklasse (Lifeform) schlägt mit, aber das scheint wie eine schreckliche Hack, der OO verletzt. Setzen Sie Links auf die Basisklasse zu den Klassen, die sie erben? Ew.

Hat jemand schon einmal auf dieses spezielle Problem gestoßen? Hast du irgendwelche Ideen? Ich werde mehr Code zur Verfügung stellen, wenn ein ausführlicheres Beispiel helfen würde zu beschreiben, was ich mehr mache.

+0

Ich hatte das gleiche Problem, und das half mir, es zu lösen. Am Ende stellte ich das Attribut für die Klasse ein, anstatt es zurückzugeben. – Guffa

Antwort

8

Von dem, was ich gelesen habe, können Sie das XMLInclude-Attribut in der Webmethode einschließen, die das Objekt zurückgibt und nicht in der Basisklasse. Immer noch nicht hübsch, aber vielleicht ein wenig mehr, als abgeleitete Klassennamen in die Basisklasse zu setzen. Ich habe es nicht ausprobiert, aber ich denke, du kannst so etwas machen.

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

Super, danke. Am Anfang funktionierte es nicht - aber es scheint den richtigen Code zu generieren, er wird einfach nicht im Sample angezeigt. Ich habe es immer wieder versucht und es schien nicht zu funktionieren, bis ich dachte "Was zum Teufel" und tatsächlich die serialisierten Objekte erzeugt. Schön. Nicht perfekt, aber hey, es ist viel besser, als meine Basisklassen zu knacken. Vielen Dank! –

+0

Wie wäre es, wenn Sie die Basisklasse als Parameter übergeben und in der Funktion GetHuman an Human übergeben möchten? Möglich? –

+0

Wie würde ich viele Arten auflisten? – Stainedart

0

Ran in genau das gleiche Problem mit VB.NET. Das Verwenden des XMLInclude-Attributs, obwohl hässlich, hat den Trick gemacht.

+0

Es ist nicht verwunderlich, dass das gleiche Problem mit VB.NET passiert, da es ein .NET-Problem ist, kein C# -Problem. –