Ich habe eine C # -Klasse, die ich geerbt habe. Ich habe das Objekt erfolgreich "gebaut". Aber ich muss das Objekt in XML serialisieren. Gibt es eine einfache Möglichkeit, dies zu tun?
Es sieht so aus, als ob die Klasse für die Serialisierung eingerichtet wurde, aber ich bin nicht sicher, wie ich die XML-Darstellung erhalten soll. Meine Klassendefinition sieht folgendermaßen aus:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.domain.com/test")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.domain.com/test", IsNullable = false)]
public partial class MyObject
{
...
}
Ich dachte, ich könnte Folgendes tun, aber es funktioniert nicht:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
Wie erhalte ich die XML-Darstellung dieses Objekts?
c#
xml-serialization
user462166
quelle
quelle
Antworten:
Sie müssen XmlSerializer für die XML-Serialisierung verwenden. Unten finden Sie ein Beispiel-Snippet.
quelle
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
anstelle vonXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
gekapselt ist, müssenStringWriter
Sie nicht beide entsorgen (die erste Verwendung ist redundant), oder? Ich gehe davon ausXmlWriter
kümmert sich um dispose es ...XmlWriter
kapselt das nicht einStringWriter
, es verwendet Ihr übergebenesStringWriter
und hat keine Erwartung / Verantwortung, es zu entsorgen. FernerStringWriter
ist außerhalbXmlWriter
Umfang s‘, sie sie brauchen, wennXmlWriter
angeordnet ist, wäre es eine schlechte Verhalten für seinXmlWriter
Ihre entsorgenStringWriter
. Wenn Sie etwas deklarieren, das entsorgt werden muss, sind Sie in der Regel dafür verantwortlich, es zu entsorgen. Und implizit zu dieser Regel, alles, was Sie nicht selbst deklarieren, sollten Sie nicht entsorgen. Also sind beideusing
s notwendig.Ich habe meine geändert, um eine Zeichenfolge zurückzugeben, anstatt eine Ref-Variable wie unten zu verwenden.
Seine Verwendung wäre wie folgt:
quelle
Exception
, haben Sie die StackTrace mit der Methode "Serialize <>" erweitert.Die folgende Funktion kann in jedes Objekt kopiert werden, um eine XML-Speicherfunktion mithilfe des System.Xml-Namespace hinzuzufügen.
Um das Objekt aus der gespeicherten Datei zu erstellen, fügen Sie die folgende Funktion hinzu und ersetzen Sie [ObjectType] durch den zu erstellenden Objekttyp.
quelle
writer.Flush()
ist in einemusing
Block redundant -writer
dieDispose()
Methode wird es für Sie spülen.Erweiterungsklasse:
Verwendungszweck:
Verweisen Sie einfach auf den Namespace, der Ihre Erweiterungsmethode enthält, in der Datei, in der Sie sie verwenden möchten, und es wird funktionieren (in meinem Beispiel wäre es:
using MyProj.Extensions;
)Beachten Sie, dass Sie
Foo
dasT
Argument in der Erweiterungsmethode ersetzen können , wenn Sie die Erweiterungsmethode nur für eine bestimmte Klasse (z. B. ) spezifisch machen möchten .public static string Serialize(this Foo value){...}
quelle
Sie können die folgende Funktion verwenden, um serialisiertes XML von jedem Objekt abzurufen.
Sie können dies vom Client aus aufrufen.
quelle
Gehen Sie wie folgt vor, um ein Objekt zu serialisieren:
Denken Sie auch daran, dass Sie einen parameterlosen Konstruktor benötigen, damit XmlSerializer funktioniert.
quelle
Ich werde mit der Antwort von Ben Gripka beginnen:
Ich habe diesen Code früher verwendet. Die Realität hat jedoch gezeigt, dass diese Lösung etwas problematisch ist. Normalerweise serialisieren die meisten Programmierer die Einstellungen beim Speichern nur und deserialisieren die Einstellungen beim Laden. Dies ist ein optimistisches Szenario. Sobald die Serialisierung fehlgeschlagen ist, wird die Datei aus irgendeinem Grund teilweise geschrieben, die XML-Datei ist nicht vollständig und ungültig. Infolgedessen funktioniert die XML-Deserialisierung nicht und Ihre Anwendung kann beim Start abstürzen. Wenn die Datei nicht riesig ist, schlage ich vor, zuerst das Objekt zu serialisieren
MemoryStream
dann den Stream in die Datei schreiben. Dieser Fall ist besonders wichtig, wenn eine komplizierte benutzerdefinierte Serialisierung vorliegt. Sie können niemals alle Fälle testen.Die Deserialisierung im realen Szenario sollte mit einer beschädigten Serialisierungsdatei zählen, es kommt irgendwann vor. Die Ladefunktion von Ben Gripka ist in Ordnung.
Und es könnte durch ein Wiederherstellungsszenario verpackt werden. Es eignet sich für Einstellungsdateien oder andere Dateien, die bei Problemen gelöscht werden können.
quelle
Alle oben genannten Antworten sind korrekt. Dies ist nur die einfachste Version:
quelle
Es ist ein bisschen komplizierter als das Anrufen
ToString
Methode der Klasse, aber nicht viel.Hier ist eine einfache Drop-In-Funktion, mit der Sie jeden Objekttyp serialisieren können. Es wird eine Zeichenfolge zurückgegeben, die den serialisierten XML-Inhalt enthält:
quelle
Hier ist ein gutes Tutorial, wie das geht
Sie sollten grundsätzlich
System.Xml.Serialization.XmlSerializer
class verwenden, um dies zu tun.quelle
Sie können das Ergebnis als XML-Datei am gewünschten Speicherort erstellen und speichern.
quelle
mein Arbeitscode. Gibt den leeren Namespace utf8 xml enable zurück.
Beispiel gibt Antwort zurück Yandex api Zahlung Aviso URL:
quelle
Ich habe eine einfache Möglichkeit, ein Objekt mit C # in XML zu serialisieren. Es funktioniert hervorragend und ist in hohem Maße wiederverwendbar. Ich weiß, dass dies ein älterer Thread ist, aber ich wollte dies posten, weil jemand dies für ihn hilfreich finden könnte.
So nenne ich die Methode:
Hier ist die Klasse, die die Arbeit macht:
Hinweis: Da es sich um Erweiterungsmethoden handelt, müssen sie sich in einer statischen Klasse befinden.
quelle
Basierend auf den oben genannten Lösungen finden Sie hier eine Erweiterungsklasse, mit der Sie jedes Objekt serialisieren und deserialisieren können. Alle anderen XML-Zuordnungen liegen bei Ihnen.
Verwenden Sie es einfach so:
quelle
Oder Sie können diese Methode zu Ihrem Objekt hinzufügen:
quelle
Hier ist ein grundlegender Code, der beim Serialisieren der C # -Objekte in XML hilft:
quelle
Sie müssen folgende Klassen verwenden:
quelle