2016-04-22 3 views
4

Я пишу приложение Windows Phone Silverlight. Я хочу сохранить объект в файл JSON. Я написал следующий фрагмент кода.C# - Сохранить объект в файле JSON

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); 

Этого достаточно, чтобы создать файл JSON, но он пуст. Я делаю что-то неправильно? Разве это не должно было записывать объект в файл?

+3

Вы [закрыть] (https://msdn.microsoft.com/en-us/library/system.io.streamwriter.close (v = vs.110) .aspx) 'StreamWriter'? Или еще лучше обернуть его в 'using (var str = new StreamWriter (isoStream)) {str.Write (jsonFile); } 'заявление? См. [Как правильно использовать класс StreamWriter?] (Https://stackoverflow.com/questions/11467240/how-to-use-streamwriter-class-properly). – dbc

+0

Нет, я не закрыл его. – tony

+0

Ну вот в чем проблема. Если вы не закрываете 'StreamWriter', часть написанного вами содержимого может не быть сброшена на диск. – dbc

ответ

1

Проблема в том, что вы не закрываете поток.

Файловый ввод-вывод в Windows имеет буферы на уровне операционной системы, а .NET может даже реализовать буферы на уровне API, а это означает, что, если вы не сообщите классу «Теперь я сделан», он никогда не узнает когда эти буферы распространяются до самого блюда.

Вы должны переписать код, только чуть-чуть, как это:

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

using (...) { ... } гарантирует, что, когда код покидает блок, то { ... } часть, он будет вызывать IDisposable.Dispose на объект, который в этом случае будет очистите буферы и закройте основной файл.

0

Я использую эти. Шоуд работает и на вас.

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; 
    } 
Смежные вопросы