2016-04-22 26 views
4

Ich schreibe eine Windows Phone Silverlight App. Ich möchte ein Objekt in einer JSON-Datei speichern. Ich habe den folgenden Code geschrieben.C# - Objekt in JSON-Datei speichern

string jsonFile = JsonConvert.SerializeObject(usr); 
IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication(); 
IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("users.json", FileMode.Create, isoStore); 

StreamWriter str = new StreamWriter(isoStream); 
str.Write(jsonFile); 

Dies ist genug, um eine JSON-Datei zu erstellen, aber es ist leer. Mache ich etwas falsch? Sollte das nicht das Objekt in die Datei schreiben?

+3

Haben Sie [close] (https://msdn.microsoft.com/en-us/library/system.io.streamwriter.close (v = vs.110) .aspx) den 'StreamWriter'? Oder besser noch, wickle es in ein 'using (var str = neuer StreamWriter (isoStream)) {str.Write (jsonFile); } Aussage? Siehe [Wie verwende ich die StreamWriter-Klasse richtig?] (Https://stackoverflow.com/questions/11467240/how-to-use-streamwriter-class-properly). – dbc

+0

Nein, ich habe es nicht geschlossen. – tony

+0

Nun, das ist das Problem dann. Wenn Sie den 'StreamWriter 'nicht schließen, werden einige der von Ihnen geschriebenen Inhalte möglicherweise nicht auf den Datenträger geschrieben. – dbc

Antwort

1

Das Problem ist, dass Sie den Stream nicht schließen.

Datei-E/A in Windows haben Puffer auf Betriebssystemebene, und .NET könnte sogar Puffer auf API-Ebene implementieren, was bedeutet, dass es nie wissen wird, wenn Sie der Klasse "Jetzt bin ich fertig" sagen wenn sichergestellt werden soll, dass diese Puffer vollständig auf den Plattenteller übertragen werden.

Sie Ihren Code nur leicht umschreiben sollte, wie folgt aus:

using (StreamWriter str = new StreamWriter(isoStream)) 
{ 
    str.Write(jsonFile); 
} 

using (...) { ... } wird sichergestellt, dass, wenn der Code den Block verlässt, der { ... } Teil, es IDisposable.Dispose auf das Objekt aufrufen wird, das wird in diesem Fall Leeren Sie die Puffer und schließen Sie die darunterliegende Datei.

0

Ich benutze diese. Shoud arbeitet auch für dich.

public async Task SaveFile(string fileName, string data) 
    { 
     System.IO.IsolatedStorage.IsolatedStorageFile local = 
      System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication(); 

     if (!local.DirectoryExists("MyDirectory")) 
      local.CreateDirectory("MyDirectory"); 

     using (var isoFileStream = 
       new System.IO.IsolatedStorage.IsolatedStorageFileStream(
        string.Format("MyDirectory\\{0}.txt", fileName), 
        System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite, 
         local)) 
     { 
      using (var isoFileWriter = new System.IO.StreamWriter(isoFileStream)) 
      { 
       await isoFileWriter.WriteAsync(data); 
      } 
     } 
    } 

    public async Task<string> LoadFile(string fileName) 
    { 
     string data; 

     System.IO.IsolatedStorage.IsolatedStorageFile local = 
      System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication(); 

     using (var isoFileStream = 
       new System.IO.IsolatedStorage.IsolatedStorageFileStream 
        (string.Format("MyDirectory\\{0}.txt", fileName), 
        System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read, 
        local)) 
     { 
      using (var isoFileReader = new System.IO.StreamReader(isoFileStream)) 
      { 
       data = await isoFileReader.ReadToEndAsync(); 
      } 
     } 

     return data; 
    }