Wie serialisiert man ein Interface typisiertes Mitglied

8

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%     
itaysk 20.04.2012, 19:15
quelle

4 Antworten

2

Basierend auf @Jens Lösung habe ich einen Serializer erstellt, der das tut, was ich brauche. Danke Jen. Hier ist der Code:

%Vor%     
itaysk 23.04.2012, 16:08
quelle
7

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%     
Henk Holterman 20.04.2012 19:24
quelle
5

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:

  1. Ausnahmebehandlung
  2. Casting oder Konvertierung des XML-Elementwerts in den korrekten Typ in der Zeile anyThingProperty.SetValue(obj, propertyElement.Value, null);
%Vor%     
Jens Granlund 20.04.2012 19:23
quelle
1

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

    
Wojtpl2 03.10.2016 10:43
quelle

Tags und Links