Seite 1 von 1

[SOLVED] Problem beim Serialisieren von abgeleiteten Klassen

Verfasst: 15.02.2013, 13:21
von BeRsErKeR
Ich habe ein ziemlich allgemeines Interface für Konfigurationsdaten und auch noch eine abstrakte Basisklasse, die das Interface nutzt. Plugin-DLLs nutzen diese Basisklasse und leiten davon ihre eigenen Konfigurationdaten-Klassen ab. Diese Plugin-DLLs werden dynamisch geladen. Dann möchte ich Daten serialisieren und deserialisieren (mit XmlSerializer), die unter anderem auch die spezifischen Konfigurationsdaten enthalten.

Prinzipiell ist dies kein Problem. Ich ermittle von allen geladenen Plugins alle Konfigurationsklassen, indem ich alle Klassen rauslese, die das Interface nutzen. Diese Typen packe ich in das extraTypes-Array des XmlSerializer-Konstruktors und schon läuft die Serialisierung und Deserialisierung problemlos.

Mein Problem ist nun, dass verschiedene Plugins ihre Konfigurationdaten-Klasse gleich nennen können, z.B. MeinPlugin1.Config und MeinPlugin2.Config. Da beim Serialisieren jedoch kein Namespace, sondern nur der Typname im XML hinterlegt wird erhalte ich beim Deserialisieren einen Fehler, da nicht klar ist welcher Typ gemeint ist. Beide Typen sind ja im extraTypes-Array vorhanden.

Weiß jemand, wie ich es hinbekomme, dass der Namespace mit ins XML geschrieben wird oder vielleicht auch ein anderer Weg, der das Problem umgeht?

Im Netz hab ich nur Lösungen dafür gefunden wie man abgeleitete Klassen serialisiert, aber das geht ja wie gesagt schon.

Danke

Re: [C#] Problem beim Serialisieren von abgeleiteten Klassen

Verfasst: 15.02.2013, 14:43
von Chromanoid
Wie wäre es mit einer Art Plugin-Config-Container-Klasse, die jedes Plugin anbieten muss. Dort könnte man dann glaube ich weitere Konfigurationsklassen per XmlInclude-Annotation dynamisch dazu laden.

Re: [C#] Problem beim Serialisieren von abgeleiteten Klassen

Verfasst: 16.02.2013, 16:49
von odenter
Ist schon ein bischen her das ich die Serialisierung aus .NET verwendet habe.

Das einzige was mir einfällt ist es komplett selber zu machen.
Also per Reflection einfach alles auslesen, alles in eine Hashmap und diese serialisieren, da könntest dann extra Keys für Namespaces einbauen. Und wäre leicht erweiterbar falls Du doch nochmal irgendwas zusätzlich haben willst/musst und "Versionsneutral" wobei das bei dem XmlSerializer eh kein Problem war oder?
Beim lesen dann auch per Reflection den Ziel-Typ erzeugen, und die gelesen Werte wieder setzen.

Re: [C#] Problem beim Serialisieren von abgeleiteten Klassen

Verfasst: 17.02.2013, 23:55
von BeRsErKeR
Danke für die Antworten. Ich habe es nun aber mittels XmlType vor der Config-Klasse gelöst.

Code: Alles auswählen

using System.Xml.Serialization;

namespace Foo
{
    [Serializable, XmlType("Foo.Bar")]
    public class Bar : Configuration
    {
        ...
    }
}
Das muss zwar jeder der ein Plugin schreibt beachten, aber es gibt eh eine Reihe von Dingen, die beachtet werden muss und es gibt eine Vorlage, die eh jeder nutzt.

Durch die obige Anpassung schreibt der Serialisierer genau diesen Namen raus und kann somit beim Laden die Klasse identifizieren. Der Namespace ist eindeutig, da er dem Namen der Plugin-DLL entspricht.