[SOLVED] Problem beim Serialisieren von abgeleiteten Klassen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[SOLVED] Problem beim Serialisieren von abgeleiteten Klassen

Beitrag 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
Zuletzt geändert von BeRsErKeR am 18.02.2013, 13:31, insgesamt 1-mal geändert.
Ohne Input kein Output.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

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

Beitrag 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.
odenter
Establishment
Beiträge: 207
Registriert: 26.02.2009, 11:58

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

Beitrag 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.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

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

Beitrag 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.
Ohne Input kein Output.
Antworten