Erstkontakt mit XmlSerializer

Ich habe mich diese Woche zum ersten Mal näher mit dem Thema XML-Serialisierung in .NET mit Hilfe der Klasse XmlSerializer auseinandergesetzt und hatte bei diesem „Erstkontakt“ eine lustige kleine Verständnis-Schwierigkeit.

Ich ging mit der mehr oder weniger stillschweigenden Grundannahme an die Sache heran, ich könne mit Hilfe des XML-Serializers eine beliebig grosse Menge von (an sich unabhängigen) Objekten in ein XML-File speichern, eines um das andere, und suchte deshalb in der Dokumentation nach Informationen und Ratschlägen darüber, wie es am besten organisiert beim De-Serialisieren, damit man weiss, welche Objekte in welcher Reihenfolge sich im XML-File befinden.

Als ich darüber nichts fand, schrieb ich ein kleines Testprogramm, öffnete einen Stream und speicherte mit Hilfe zweier Serializers direkt zwei verschiedene Objekte hinein. Dieses Testprogramm lief durch, erzeugte aber ein ungültiges File, denn dessen Inhalt entsprach einfach zwei kompletten XML-Files aneinandergehängt.

Ich modifizierte das Programm und verwendete einen XmlWriter. Dieser merkte beim Serialisieren des zweiten Objekts, das etwas nicht stimmte, und verursachte eine Exception, allerdings mit einem ziemlich nichtssagenden Fehlertext, so in der Art „geht nicht“.

Erst dann dämmerte es mir langsam, dass ich mit meiner Grundanahme einer völligen Freiheit beim Serialisieren wohl danebenlag. Ich stellte danach fest, dass die Dokumentation eigentlich ganz klar ausdrückt, dass man nur genau ein Objekt in ein XML-File serialisieren kann, denn bei der Methode Serialize steht die Information Serializes the specified Object and writes the XML document to a file. Man beachte das Wort „document“.

Ich habe bei einer Suche im Internet per Google alle möglichen Texte über verschiedenste Limitationen von XmlSerialize gefunden, aber keinen, wo jemand demselben Irrtum unterlag wie ich und schliesslich zur Erkenntnis gelangte, nein, mehr als 1 Objekt geht nicht.

Ich habe mich auch gefragt, ob das nun innerhalb des .NET-Frameworks ein Beispiel von schlechtem Klassen-Design sei, wenn man so leicht völligen Unsinn anstellen kann und erst zur Laufzeit abgefangen wird. Ich sehe aber nicht, wie man die beteiligten Klassen und Methoden so definieren könnte, dass man gar nicht in die Versuchung kommen kann, mehrere Objekte ins selbe File zu serialisieren.

Natürlich könnte man anstelle eines Stream-Objekts der Methode Serialize alle Angaben mitgeben, damit sie intern einen Stream erzeugen kann (den man dann eben als Programmierer gar nicht zur Verfügung hätte, um zu versuchen, noch etwas anderes hineinzuschreiben), aber das ist nicht sinnvoll.

Am interessantesten an der ganzen Sache war, mich selbst dabei zu beobachten, wie viel es manchmal braucht, um quasi auf den richtigen Weg zurückzufinden, wenn man bereits früh falsch abgebogen und eine Weile falsch marschiert ist!

Veröffentlicht in Keine Kategorie. Schlagwörter: , . Leave a Comment »

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: