![]() |
XML-Serialisierung, zweite Runde: Namensgebung
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:
XML-Code:
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:
<MyShape xsi:type="Rectangle" />
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 ^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz