web-dev-qa-db-fra.com

Écrire un flux de mémoire dans un fichier

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();
 }
5
Coding Duchess

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.

17
Philippe Paré

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; }
}
1
Aron

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.

0
Russ

// réinitialise la position du flux 

ms.Position = 0;

// Puis copie dans filestream

ms.CopyTo(fileStream);
0
santosh singh