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