web-dev-qa-db-fra.com

DataContractSerializer - comment puis-je sortir le xml dans une chaîne (par opposition à un fichier)

J'avais une petite question concernant le datacontractserializer. C'est peut-être plus une question de flux. J'ai trouvé un morceau de code qui écrit le xml dans un flux de fichiers. Je ne veux essentiellement pas le fichier et j'ai juste besoin de la sortie de chaîne.

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 () n'est évidemment pas ce que je recherche. Quel flux ou écrivain, etc., puis-je utiliser pour renvoyer la chaîne appropriée et non pour créer un fichier? J'ai regardé le XML créé par le flux de fichiers et c'est exactement ce que je recherche. Le XmlSerializer a écrit le XML un peu étrange et je préfère la sortie du DataContractSerializer dans ce cas. Est-ce que quelqu'un peut-il me montrer la bonne direction?

39
Hcabnettek

Quelque chose comme ça - mettez votre sortie dans un MemoryStream puis relisez-le dans:

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;
        }
    }
}
67
marc_s

Merci à @ xr280xr d'avoir signalé ma disposition de StringWriter oubliée dans le premier brouillon.

/// <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();
    }
}
27
Pat

Et encore plus simple:

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();
}
20
root

Je suggère de combiner les méthodes données par Pat et 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();
    }
}
3
Ohad Schneider

Une variante de la réponse de @ root:

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

return sb.ToString();
2
Johan Larsson