C # - Wie man das Objekt selbst deserialisiert?

7
%Vor%

Ich habe es geschafft, ohne Probleme zu speichern, alle Mitglieder von FolderOption sind deserialisiert. Aber das Problem ist, wie man es zurück liest? Die Zeile - // dies = (Optionen) deserializer.Deserialize (textReader); wird nicht funktionieren.

Bearbeiten: Jede Lösung für dieses Problem? Können wir den gleichen Zweck erreichen, ohne diesem zuzuordnen? Das ist Deserialize Optionen Objekt zurück in Option. Ich bin faul, es Eigentum für Eigentum zu tun. Auf höchster Ebene zu arbeiten würde viel Aufwand ersparen.

    
david.healed 04.07.2009, 02:05
quelle

7 Antworten

11

Dies funktioniert, wenn Ihr Optionstyp eine Struktur ist, da Sie eine Struktur selbst ändern können.

Wenn Optionen eine Klasse (Referenztyp) ist, können Sie der aktuellen Instanz eines Referenztyps in diesem Fall nicht zuweisen. Ich schlage vor, dass Sie eine Hilfsklasse schreiben und Ihre Read- und Save-Methoden wie folgt einfügen:

%Vor%

Und dann verbrauchen Sie es von Ihrem Aufrufer, um Objekte zu lesen und zu speichern, anstatt es aus der Klasse auszuprobieren.

%Vor%

Und setzen Sie den XmlSerializerHelper in den Namespace Ihres Utils, er ist wiederverwendbar und funktioniert mit jedem Typ.

    
amazedsaint 04.07.2009, 02:30
quelle
18

Erstellen Sie Ihre Methode .Read() als statische Funktion, die das gelesene Objekt zurückgibt:

%Vor%

Ändern Sie dann Ihren Anrufcode, anstatt etwas wie folgt:

%Vor%

Sie tun etwas wie folgt:

%Vor%

Der schöne Unterschied ist, dass es unmöglich ist, jemals ein Options-Objekt zu haben, das keine Daten enthält.

    
Joel Coehoorn 04.07.2009 02:41
quelle
5

Ein Objekt kann sich per Definition nicht selbst deserialisieren: Es existiert bereits und die Deserialisierung erstellt eine neue Instanz des Typs.

Manchmal ist es sinnvoll, eine neue, leere Instanz einer Klasse zu erstellen und sie dann mit Informationen aus XML einzufügen. Die Instanz könnte auch "fast leer" sein. Sie können dies zum Beispiel tun, um Benutzereinstellungen zu laden oder um die Instanz im Allgemeinen wieder so einzurichten, wie sie einmal war. Der Zustand "leer" oder "fast leer" der Instanz wäre ein gültiger Zustand für die Klasse: Sie würde einfach nicht wissen, in welchem ​​Zustand sie sich befand, bevor sie beibehalten wurde.

Ich empfehle auch, dass Sie sich angewöhnen, "using" -Blöcke zu implementieren:

%Vor%

Dies stellt sicher, dass die TextReader gelöscht werden, selbst wenn eine Ausnahme ausgelöst wird. Deshalb werden die Close-Aufrufe nicht mehr benötigt.

    
John Saunders 04.07.2009 02:12
quelle
2

Ich denke, der einfachste Weg, ein Objekt zu serialisieren und zu deserialisieren, ist die Verwendung einer statischen Klasse mit den folgenden zwei Methoden. Wir benötigen außerdem eine Klasse namens StringWriterWithEncoding, um die Codierung der XML-Zeichenfolge festzulegen, da die Encoding-Eigenschaft der Standard-StringWriter-Klasse schreibgeschützt ist. (hier gefunden: Ссылка )

%Vor%

Verwendung:

%Vor%     
Tamás Varga 23.06.2011 18:15
quelle
2

Ich bin Fan von Erweiterungsmethoden, deshalb benutze ich das immer:

%Vor%

Verwendung zum Serialisieren:

%Vor%

oder

%Vor%

oder

%Vor%

Verwendung zum Deserialisieren:

%Vor%

oder

%Vor%

Und Sie haben es laufen:)

Ich bevorzuge Erweiterungsmethoden, weil es Ihnen erlaubt, Ihren Code sehr sauber zu halten. Dies funktioniert mit jedem Typ von Objekttyp, den Sie haben, solange es das Attribut [Serializable] darauf implementiert.

Wenn Sie angeben müssen, wie es serialisiert werden soll (als Knoten oder Attribute), können Sie das Attribut für jede Ihrer Eigenschaften hinzufügen, beispielsweise:

%Vor%

Hoffe das hilft jemandem in der Zukunft.

Alejandro

    
coloboxp 31.10.2013 14:00
quelle
1

Ich ging für diesen Ansatz (in Vb)

%Vor%

Ich kann dann einfach so etwas verwenden:

%Vor%

und nenne es so:

%Vor%

oder noch besser (wenn ich den notwendigen Konstruktor hinzufüge):

%Vor%

Es scheint mir nett und sauber und funktioniert gut in meiner Situation.

Prost

    
wheelibin 06.05.2010 07:57
quelle
0

Siehe XmlSerializer.Deserialize-Methode : Sie könnten eine statische Methode wie die folgende erstellen:

%Vor%

Das obige kann wie folgt aufgerufen werden:

%Vor%     
Eugene Yokota 04.07.2009 02:10
quelle

Tags und Links