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.
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.
Erstellen Sie Ihre Methode .Read()
als statische Funktion, die das gelesene Objekt zurückgibt:
Ä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.
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.
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%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
Siehe XmlSerializer.Deserialize-Methode : Sie könnten eine statische Methode wie die folgende erstellen:
%Vor%Das obige kann wie folgt aufgerufen werden:
%Vor%Tags und Links c# serialization