Ich habe die folgende Methode, um ein Objekt in einer Datei zu speichern:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
Ich gebe zu, dass ich es nicht geschrieben habe (ich habe es nur in eine Erweiterungsmethode konvertiert, die einen Typparameter verwendet hat).
Jetzt brauche ich es, um mir die XML als Zeichenfolge zurückzugeben (anstatt sie in einer Datei zu speichern). Ich prüfe es, aber ich habe es noch nicht herausgefunden.
Ich dachte, das könnte für jemanden, der mit diesen Objekten vertraut ist, wirklich einfach sein. Wenn nicht, werde ich es irgendwann herausfinden.
quelle
typeof(T)
Versus besprechen möchtentoSerialize.GetType()
, tun Sie dies bitte, aber nicht in meiner Antwort. Vielen Dank.Ich weiß, dass dies nicht wirklich eine Antwort auf die Frage ist, aber basierend auf der Anzahl der Stimmen für die Frage und der akzeptierten Antwort vermute ich, dass die Leute den Code tatsächlich verwenden, um ein Objekt in eine Zeichenfolge zu serialisieren.
Durch die Verwendung der XML-Serialisierung wird der Ausgabe unnötiger zusätzlicher Textabfall hinzugefügt.
Für die folgende Klasse
es erzeugt
Eine bessere Lösung ist die Verwendung der JSON-Serialisierung (eine der besten ist Json.NET ). So serialisieren Sie ein Objekt:
So deserialisieren Sie ein Objekt:
Die serialisierte JSON-Zeichenfolge würde folgendermaßen aussehen:
quelle
Serialisieren und Deserialisieren (XML / JSON):
quelle
Code Sicherheitshinweis
In Bezug auf die akzeptierte Antwort , ist es wichtig , zu verwenden ,
toSerialize.GetType()
statttypeof(T)
imXmlSerializer
Konstruktor: Wenn Sie das erste der Code umfasst alle möglichen Szenarien verwenden, während die letztere mit manchmal nicht.Hier ist ein Link mit einem Beispielcode, der diese Anweisung motiviert und bei Verwendung
XmlSerializer
eine Ausnahme auslösttypeof(T)
, da Sie eine Instanz eines abgeleiteten Typs an eine Methode übergeben, die aufruftSerializeObject<T>()
, die in der Basisklasse des abgeleiteten Typs definiert ist: http: // ideone .com / 1Z5J1 . Beachten Sie, dass Ideone Mono zum Ausführen von Code verwendet: Die tatsächliche Ausnahme, die Sie mit der Microsoft .NET-Laufzeit erhalten würden, hat eine andere Meldung als die in Ideone gezeigte, schlägt jedoch trotzdem fehl.Der Vollständigkeit halber veröffentliche ich hier das vollständige Codebeispiel als Referenz für den Fall, dass Ideone (wo ich den Code veröffentlicht habe) in Zukunft nicht mehr verfügbar ist:
quelle
using (StringWriter textWriter = new StringWriter() {}
um das Objekt ordnungsgemäß zu schließen / zu entsorgen.using
Aussage sowohl für uns als auch für unsere liebenIDisposable
Implementierungsobjekte der beste Freund ist ;)Mein 2p ...
quelle
quelle
Ich konnte die von xhafan vorgeschlagene JSONConvert-Methode nicht verwenden
In .Net 4.5 konnte ich auch nach dem Hinzufügen der Assemblyreferenz "System.Web.Extensions" nicht auf JSONConvert zugreifen.
Sobald Sie jedoch die Referenz hinzugefügt haben, können Sie denselben Zeichenfolgendruck mit folgenden Zeichen erhalten:
quelle
Ich hatte das Gefühl, dass ich diesen manipulierten Code an die akzeptierte Antwort weitergeben musste - da ich keinen Ruf habe, kann ich keinen Kommentar abgeben.
quelle
In einigen seltenen Fällen möchten Sie möglicherweise Ihre eigene String-Serialisierung implementieren.
Aber das ist wahrscheinlich eine schlechte Idee, wenn Sie nicht wissen, was Sie tun. (zB Serialisierung für E / A mit einer Batchdatei)
So etwas würde den Trick machen (und es wäre einfach, von Hand / Batch zu bearbeiten), aber seien Sie vorsichtig, dass weitere Überprüfungen durchgeführt werden sollten, da dieser Name keine neue Zeile enthält.
quelle
[VB]
[C #]
quelle