Wie serialisieren Schnittstelle eingegeben Mitglied
Habe ich eine Klasse, die hat eine Eigenschaft, die definiert ist als Schnittstelle.
Nutzer meiner Klasse zuweisen können, um diese Eigenschaft einer Klasse Umsetzung, die die Schnittstelle implementiert.
Ich möchte in der Lage sein, um dieses zu laden Klasse Zustand aus einer Textdatei auf der Festplatte. Benutzer sollten in der Lage sein, um Sie manuell ändern Sie die xml-Datei, um die Anwendung der operation.
Wenn ich versuche zu serialisieren meiner Klasse, es sagt mir, ich kann nicht serialisieren, die eine Schnittstelle.
Ich verstehe, dass der serializer hat keine Kenntnis über die Struktur des Eigentums ist Klasse, nur um zu wissen, dass es eine Schnittstelle implementiert.
Hätte ich erwartet, dass es zu aufrufen der GetType auf das Mitglied, und spiegeln die Struktur der eigentlichen Klasse. Gibt es eine Möglichkeit, dies zu erreichen?
Gibt es einen anderen Weg zur Umsetzung meiner Anforderungen?
Bearbeiten: Klärung, meine Absichten:
Lässt sagen, dass ich diese Klasse:
class Car
{
IEngine engine
}
class ElectricEngine : IEngine
{
int batteryPrecentageLeft;
}
class InternalCombustionEngine : IEngine
{
int gasLitersLeft;
}
und die Klasse Benutzer hat eine Klasse mit
Car myCar = new Car();
myCar.Engine = new ElectricEngine() {batteryPrecentageLeft= 70};
Wenn ich serialisieren der Klasse myCar, erwarte ich das die xml Aussehen wie diese:
<Car>
<Engine>
<ElectricEngine>
<batteryPrecentageLeft>70</batteryPrecentageLeft>
</ElectricEngine>
<Engine>
</Car>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie markieren die Eigenschaft als " nicht-zählen.
Gibt es ein tieferes problem ist aber: Serialisierung kann nur erfassen, einfache 'Staat', nicht Verhalten. Ihre Klasse, ist nicht serialisierbar Art. Was 'Wert' erwarten Sie, dass die Eigenschaft zu haben, nach der Deserialisierung?
null
ist die einzige option.Die richtige Lösung wäre, zu denken, Was sollte eigentlich werden, speichern Sie und verwenden Sie ein DTO für das Teil.
Folgendes Modell serialisiert werden kann:
Vielleicht könnten Sie eine Basis-Klasse, statt einem interface und serialisieren Sie, dass.
Update
Erkannte ich, dass Sie eine base-Klasse war nicht wirklich eine option für Sie.
Die beste Lösung wäre wahrscheinlich zu tun, einen workaround mit einem DTO wie Henk Holterman angegeben.
Aber wenn Sie wirklich wollen, eine Lösung für Ihre Frage, ich denke, Sie würde erstellen Sie Ihre eigenen benutzerdefinierte serializer, aber das würde ich nicht empfehlen, da würden Sie am Ende mit einer Menge bugs zu Sortieren.
Hier ist ein Beispiel für eine benutzerdefinierte serializer, beachten Sie, dass in diesem Beispiel wird
benötigen Sie einige Arbeit zu nutzen vollem in einer realen Anwendung.
Mindestens zwei Dinge Hinzugefügt werden, die für diese Arbeit mehr als nur ein Beispiel:
anyThingProperty.SetValue(obj, propertyElement.Value, null);
[XmlInclude()]
zu verkünden, die Typen.interface IEngine : ISerializable
es funktionieren könnte. Aber das ist eine andere serializer.Basierend auf @Jens-Lösung habe ich einen serializer, der das tut, was ich brauche. Dank Jen.
Hier ist der code:
Können Sie ExtendedXmlSerializer.
Wenn Sie eine Klassen:
und erstellen Sie eine Instanz dieser Klasse:
Können Sie serialisieren Sie das Objekt mit ExtendedXmlSerializer:
Xml-Ausgabe wird wie folgt Aussehen:
Können Sie installieren ExtendedXmlSerializer von nuget oder führen Sie den folgenden Befehl ein:
Hier ist online-Beispiel