86 Stimmen

XML-Serialisierung und vererbte Typen

Im Anschluss an meine vorherige Frage Ich habe auf immer mein Objektmodell in XML zu serialisieren gearbeitet. Aber ich habe jetzt in ein Problem laufen (quelle Überraschung!).

Das Problem, das ich habe, ist, dass ich eine Sammlung habe, die von einem abstrakten Basisklassentyp ist, der von den konkreten abgeleiteten Typen bevölkert wird.

Ich dachte, es wäre in Ordnung, einfach die XML-Attribute zu allen beteiligten Klassen hinzuzufügen, und alles wäre in Butter. Leider ist das nicht der Fall!

Ich habe also ein wenig bei Google recherchiert und verstehe jetzt warum Es funktioniert nicht. In diesem die XmlSerializer tut in der Tat einige clevere Reflexion, um Objekte in/aus XML zu serialisieren, und da es auf dem abstrakten Typ basiert, kann es nicht herausfinden, was zur Hölle es spricht mit . Gut.

Ich stieß auf diese Seite auf CodeProject, die aussieht, wie es gut eine Menge helfen kann (noch zu lesen/verzehren vollständig), aber ich dachte, ich möchte dieses Problem auf den StackOverflow-Tisch zu bringen, um zu sehen, wenn Sie alle ordentlichen Hacks/Tricks haben, um dies in die schnellste/leichteste Weise möglich zu erhalten.

Eine Sache, die ich noch hinzufügen sollte, ist, dass ich NICHT wollen die XmlInclude Route. Es ist einfach zu viel damit gekoppelt, und dieser Bereich des Systems wird intensiv weiterentwickelt, so dass die Wartung ein echtes Problem darstellen würde!

1voto

TheSmurf Punkte 15101

Ich habe ähnliche Dinge getan. Normalerweise stelle ich sicher, dass alle XML-Serialisierungsattribute in der konkreten Klasse vorhanden sind, und lasse die Eigenschaften dieser Klasse einfach die Basisklassen aufrufen (sofern erforderlich), um Informationen abzurufen, die de/serialisiert werden, wenn der Serializer diese Eigenschaften aufruft. Das ist zwar etwas mehr Programmierarbeit, aber es funktioniert viel besser als der Versuch, den Serialisierer zu zwingen, einfach das Richtige zu tun.

1voto

user2009677 Punkte 426

Noch besser ist es, die Notation zu verwenden:

[XmlRoot]
public class MyClass {
    public abstract class MyAbstract {} 
    public class MyInherited : MyAbstract {} 
    [XmlArray(), XmlArrayItem(typeof(MyInherited))] 
    public MyAbstract[] Items {get; set; } 
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X