Lors de la tentative de lecture à partir d'un MemoryStream (qui a été écrit par un XmlWriter), il lance un ObjectDisposedException ("Cannot access a closed Stream.")
. Je suis tombé sur le fait que la fermeture de XmlWriter au milieu de l'instruction 'using' permet au code de retourner sans lancer. Quelque chose est louche ici.Sérialisation pour diffuser puis lire à partir du flux
public static string SerializeToString(T obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (var stream = new MemoryStream())
using (var writer = XmlWriter.Create(stream))
{
serializer.Serialize(writer, obj);
writer.Flush();
// Swapping the flush for close fixes the ObjectDisposedException
//writer.Close();
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}
}
Cela se produit pour Silverlight et .NET 4.5.
Après avoir lu autour je pouvais lire une chaîne à partir du flux de mémoire directement par la réponse de Jon herereturn Encoding.UTF8.GetString(stream.GetBuffer(), 0, stream.Length);
Mais d'abord je voudrais comprendre ce qui se passe à faire l'exception dans le code exemple.
Très mauvaise recommandation - ne pas suivre - toujours disposer des objets 'IDisposable'. Vous pouvez utiliser 'MemoryStream.GetBuffer' et' MemoryStream.ToArray' sur 'MemoryStream' disposé comme ils existent exactement pour cette raison. –
Pouvez-vous s'il vous plaît poster votre solution? Lorsque vous utilisez deux utilisations imbriquées, une exception se produit pour disposer le flux de base deux fois. La seule raison pour laquelle j'ai répondu à ma question était d'essayer de faire la lumière sur l'origine du problème lors de l'utilisation des instructions 'using' imbriquées dans l'extrait de code original. – aitee
Le code a été mis à jour. Même en disposant du XmlWriter. Le MemoryStream ne peut pas être mis dans l'utilisation comme il se déclenche quand la disposition est appelée sur un flux déjà fermé. Si vous avez une solution meilleure ou plus correcte, j'apprécierais vraiment si vous aviez l'intention de le publier. Merci! – aitee