Ich habe eine Klasse mit einer Eigenschaft, die als Schnittstelle definiert ist. Benutzer meiner Klasse können dieser Eigenschaft jede Klassenimplementierung zuweisen, die die Schnittstelle implementiert. Ich möchte in der Lage sein, diesen Klassenstatus aus einer Textdatei auf dem Datenträger zu laden. Benutzer sollten in der Lage sein, die XML-Datei manuell zu ändern, um den Betrieb der Anwendung zu steuern.
Wenn ich versuche, meine Klasse zu serialisieren, sagt sie mir, dass ich eine Schnittstelle nicht serialisieren kann. Ich verstehe, dass der Serializer keine Kenntnis über die Struktur der Klasse der Eigenschaft hat, nur wissend, dass es eine Schnittstelle implementiert.
Ich hätte erwartet, dass GetType auf dem Member aufgerufen wird und in die Struktur der tatsächlichen Klasse reflektiert wird. Gibt es einen Weg, dies zu erreichen? Gibt es eine andere Möglichkeit, meine Anforderung zu implementieren?
Bearbeiten : Meine Absichten klären: Sagen wir, ich habe diese Klasse:
%Vor%und der Klassenbenutzer hat eine Klasse mit
%Vor%Wenn ich die Klasse myCar serialisieren möchte, erwarte ich, dass die XML-Datei dieser ähnelt:
%Vor%Sie können die Eigenschaft als Do-not-include markieren.
Es gibt jedoch ein tieferes Problem: Die Serialisierung kann nur einen einfachen "Zustand" erfassen, nicht ein Verhalten. Ihre Klasse ist nicht serialisierbar. Welchen "Wert" erwarten Sie nach der Deserialisierung? null
ist die einzige Option.
Die richtige Problemumgehung wäre es, darüber nachzudenken, was eigentlich sicher sein soll, und ein DTO für diesen Teil zu verwenden.
Das folgende Modell kann serialisiert werden:
%Vor%Vielleicht könnten Sie eine Basisklasse anstelle einer Schnittstelle verwenden und diese serialisieren.
Aktualisieren
Ich habe festgestellt, dass die Verwendung einer Basisklasse für Sie keine wirkliche Option ist.
Die beste Lösung wäre wahrscheinlich eine Workaround mit einem DTO wie Henk Holterman.
Aber wenn Sie wirklich eine Lösung für Ihre Frage wünschen, denke ich, dass Sie Ihren eigenen angepassten Serialisierer erstellen müssten, aber ich würde das nicht empfehlen, weil Sie am Ende viele Fehler haben würden.
Hier ist ein Beispiel für einen benutzerdefinierten Serializer, bedenken Sie, dass dieses Beispiel funktioniert brauche etwas Arbeit, um in einer realen Anwendung voll genutzt zu werden.
Dazu müssen mindestens zwei Dinge hinzugefügt werden, um mehr zu erreichen als nur ein Beispiel:
anyThingProperty.SetValue(obj, propertyElement.Value, null);
Sie können ExtendedXmlSerializer verwenden. Wenn Sie einen Kurs haben:
%Vor%und erstelle eine Instanz dieser Klasse:
%Vor%Sie können dieses Objekt mit ExtendedXmlSerializer serialisieren:
%Vor%Ausgabe-XML sieht wie folgt aus:
%Vor%Sie können den ExtendedXmlSerializer von nugget installieren oder den folgenden Befehl ausführen:
%Vor%Hier ist Online-Beispiel
Tags und Links .net c# xml-serialization