33

Ich hatte eine kurze Frage bezüglich der DatacontractSerializer. Vielleicht ist es eher eine Stream-Frage. Ich habe einen Code gefunden, der das XML in einen Filestream schreibt. Ich möchte im Grunde nicht die Datei und brauche nur die String-Ausgabe.DataContractSerializer - wie kann ich die XML in eine Zeichenfolge ausgeben (im Gegensatz zu einer Datei)

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    var fs = new FileStream("test.xml", FileMode.OpenOrCreate); 
    var serializer = new DataContractSerializer(typeof(T)); 
    serializer.WriteObject(fs, objectToSerialize); 
    fs.Close(); 
    return fs.ToString(); 
} 

fs.ToString() ist offensichtlich nicht das, was ich suche. Welcher Stream oder Schreiber usw. kann ich nur verwenden, um die richtige Zeichenfolge zurückzugeben und keine Datei zu erstellen? Ich habe mir den XML-Code angeschaut, den der Filestream erstellt hat, und es ist genau das, wonach ich suche. Der XmlSerializer hat das XML etwas seltsam geschrieben und ich bevorzuge in diesem Fall die Ausgabe des DataContractSerializers. Kann mir jemand in die richtige Richtung zeigen?

Antwort

60

Etwas ähnliches - setzen Sie Ihre Ausgabe in ein MemoryStream und dann gelesen, dass auf der Rückseite:

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using(MemoryStream memStm = new MemoryStream()) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     serializer.WriteObject(memStm, objectToSerialize); 

     memStm.Seek(0, SeekOrigin.Begin); 

     using(var streamReader = new StreamReader(memStm)) 
     { 
      string result = streamReader.ReadToEnd(); 
      return result; 
     } 
    } 
} 
+2

Sieht aus wie du inter änderte den Parameter, es sollte memStm.Seek sein (0, SeekOrigin.Begin); – xar

+0

@xar: Ja, du hast absolut recht - danke, dass du diesen Fehler entdeckt hast - ich habe ihn jetzt behoben –

+0

Diese Lösung kodiert unnötigerweise zu/von utf8. –

22

Dank @ xr280xr für meine vergessen String Entsorgung im ersten Entwurf Hinweis.

/// <summary> 
/// Converts this instance to XML. 
/// </summary> 
/// <returns>XML representing this instance.</returns> 
public string ToXml() 
{ 
    var serializer = new DataContractSerializer(this.GetType()); 
    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output) { Formatting = Formatting.Indented }) 
    { 
     serializer.WriteObject(writer, this); 
     return output.GetStringBuilder().ToString(); 
    } 
} 
+1

Ihr StringWriter sollte ebenfalls entsorgt werden. – xr280xr

+5

Die gestapelten Usings tun genau das. – StingyJack

+0

Dies wäre auch eine großartige Erweiterungsmethode für DataContractSerializer (und analog für XmlSerializer). 'public static string WriteObjectToString (dieser Serializer des DataContractSerializers, object obj) {...}' – JamesFaix

18

Und noch einfacher:

var serializer = new DataContractSerializer(typeof(T)); 
var sb = new StringBuilder(); 
using (var writer = XmlWriter.Create(sb)) 
{ 
    serializer.WriteObject(writer, objectToSerialize); 
    writer.Flush(); 
    return sb.ToString(); 
} 
2

Ich schlage vor, die Methoden von Pat gegeben kombiniert und marc_s:

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output) {Formatting = Formatting.Indented}) 
    { 
     new DataContractSerializer(typeof (T)).WriteObject(writer, objectToSerialize); 
     return output.GetStringBuilder().ToString(); 
    } 
} 
+0

Dies ist Pats Methode mit der Methodensignatur von marc_s. – HappyNomad

0

Eine Variante Antwort des @ root:

var serializer = new DataContractSerializer(typeof(T)); 
var sb = new StringBuilder(); 
using (var writer = XmlWriter.Create(sb)) 
{ 
    serializer.WriteObject(writer, objectToSerialize); 
} 

return sb.ToString();