AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C# XML-Serialisierung, zweite Runde: Namensgebung
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Serialisierung, zweite Runde: Namensgebung

Ein Thema von OregonGhost · begonnen am 9. Apr 2006
Antwort Antwort
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#1

XML-Serialisierung, zweite Runde: Namensgebung

  Alt 9. Apr 2006, 12:46
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:
  1. 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.
  2. 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.
  3. Ä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 ^^
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz