Moin,
wie bereits in einem anderen Thread erwähnt, arbeite ich zurzeit an der
XML-Serialisierung einer umfangreichen Objekthierarchie. Dabei bin ich auf ein interessantes Problem gestoßen, bei dem mich weniger die Frage der technischen als die der ideologischen Lösung beschäftigt. Stark vereinfacht sieht die Situation wie folgt aus:
Es gibt eine Basisklasse Shape, die eine grafische Form darstellt, z.B. Ellipse, Rechteck usw.
Für jede mögliche Form gibt es eine Ableitung, also z.B. die Klassen Ellipse und Rectangle.
Das erste kleinere Problem ist, natürlich verdeckt diese Klasse Rectangle, solange ich mich im Namespace der Anwendung befinde, den Typ System.Drawing.Rectangle, auf den man aber unter Angabe des Namespace weiterhin zugreifen kann. Kleine Unschönheit also, die nicht wirklich störend ist. Interessanter wird es jedoch bei der Serialisierung. Ich habe vereinfacht eine Eigenschaft vom Typ Shape, die aber tatsächlich einen Wert vom Typ Ellipse oder Rectangle enthalten kann. Die Serialisierung vermerkt also beim Speichern, dass dieses Feld nicht vom Typ ist, der in der Klassendeklaration vermerkt ist, sondern einen abgeleiteten Typ hat:
<MyShape xsi:type="Rectangle" />
Das funktioniert wunderbar, solange dieser Typ nicht Rectangle ist. In dem Fall nämlich wirft der XmlSerializer eine Ausnahme, die sinngemäß lautet: Die Typen MyNamespace.Rectangle und System.Drawing.Rectangle haben denselben Namen, womit Rectangle nicht mehr eindeutig ist. Einiges Studium der Dokumentation führt mich zu der Annahme, dass folgende Lösungsmöglichkeiten in Frage kommen:
- Umbenennung des Typs, so dass es in meiner Anwendung keine zwei Typen Rectangle mehr gibt. Damit löst sich auch das Problem des verdeckten System.Drawing.Rectangle, auch wenn das eher kosmetischer Natur ist.
- Umbenennung des Typs nur für die XML-Serialisierung mit dem XmlTypeAttribute. Das dürfte funktionieren, bedeutet aber, dass in der XML-Datei zwar die "natürlichen" Namen Ellipse oder Polygon vorkommen, aber eben nicht mehr Rectangle. Die Datei sollte aber für menschliche Leser nachvollziehbar oder sogar zu verändern sein.
- Änderung des XML-Namespace für diesen Typ über das XmlTypeAttribute. Ich bin nicht sicher, aber wenn ich das richtig interpretiere, würde das funktionieren, weil zurzeit beide Rectangle-Typen im globalen XML-Namespace liegen.
Punkt 1 und 2 finde ich nicht ideal, weil ein Rechteck nunmal ein Rechteck, also ein Rectangle ist, und nichts anderes. Die größte Schwierigkeit hierbei wäre, und das ist meine erste Frage, einen anderen Namen zu finden. Ich habe überlegt, so etwas vereinfachtes wie RectangleShape zu verwenden, aber entweder wird das dann inkonsistent mit den anderen, oder die anderen müssen auch umbenennt werden und das ganze wird etwas sperrig.
Punkt 3 hat in meinen Augen einen vergleichbaren Nachteil, entweder kommt nur diese eine Klasse in den neuen
XML-Namespace, oder aber es müssen alle anderen Klassen, die serialisiert werden, ebenfalls in diesen Namespace, was nicht nur einen recht großen Aufwand erfordert, sondern eben nur wegen dieses einen Namenskonflikts geschieht.
Die Frage ist also, welcher dieser drei Punkte ist aus ideologischen Gesichtspunkten der beste, gibt es eventuell weitere, bessere, Möglichkeiten und falls eine Umbennung des Typs (als Klasse oder nur für die Serialisierung) die beste Möglichkeit ist, wie sollte man den Typ nennen?
Interessant eigentlich, dass durch die ganze Namespace-Geschichte Namenskonflikte ja eigentlich nicht mehr auftreten sollten, aber ich habe keine Möglichkeit gefunden, dem
XML-Serialisierer mitzuteilen, dass er bitte den Namespace für Rectangle mitspeichern sollte.
PS: Ich liebe meine alltäglichen Probleme ^^