J'ai essayé de récupérer des données au format JSON sous forme de chaîne et de les écrire dans un fichier, et cela a très bien fonctionné. Maintenant, j'essaie d'utiliser MemoryStream pour faire la même chose mais rien n'est écrit dans un fichier - simplement [{}, {}, {}, {}, {}] sans aucune donnée réelle.
Ma question est la suivante: comment puis-je vérifier si les données vont effectivement dans le flux de mémoire correctement ou si le problème survient ailleurs? Je sais que ma liste contient des données.
Voici mon code:
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(List<myClass>));
dcjs.WriteObject(ms, myList);
using (FileStream fs = new FileStream(Path.Combine(Application.StartupPath,"MyFile.json"), FileMode.OpenOrCreate))
{
ms.Position = 0;
ms.Read(ms.ToArray(), 0, (int)ms.Length);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
ms.Close();
fs.Flush();
fs.Close();
}
Il existe une méthode très pratique, Stream.CopyTo(Stream)
.
using (MemoryStream ms = new MemoryStream())
{
StreamWriter writer = new StreamWriter(ms);
writer.WriteLine("asdasdasasdfasdasd");
writer.Flush();
//You have to rewind the MemoryStream before copying
ms.Seek(0, SeekOrigin.Begin);
using (FileStream fs = new FileStream("output.txt", FileMode.OpenOrCreate))
{
ms.CopyTo(fs);
fs.Flush();
}
}
De plus, vous n'avez pas besoin de fermer fs
car c'est dans une instruction using et sera éliminé à la fin.
Le problème n’a rien à voir avec votre flux de fichiers/flux de mémoire. Le problème est que DataContractJsonSerializer
est un sérialiseur OPT IN. Vous devez ajouter [DataMemberAttribute]
à toutes les propriétés que vous devez sérialiser sur myClass
.
[DataContract]
public class myClass
{
[DataMember]
public string Foo { get; set; }
}
Cette ligne semble problématique:
ms.Read(ms.ToArray(), 0, (int)ms.Length);
Vous ne devriez pas avoir besoin de lire quoi que ce soit dans le flux de mémoire à ce stade, en particulier lorsque votre code est écrit pour lire ms en ms.
Je suis assez confiant que le simple fait de supprimer cette ligne résoudra votre problème.
// réinitialise la position du flux
ms.Position = 0;
// Puis copie dans filestream
ms.CopyTo(fileStream);