C# - 将对象保存到 JSON 文件

C# - Save object to JSON file

我正在编写 Windows Phone Silverlight 应用程序。我想将对象保存到 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 文件,但它是空的。难道我做错了什么?这不是应该将对象写入文件吗?

我用这些。应该也适合你。

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

问题是您没有关闭流。

Windows 中的文件 I/O 在操作系统级别有缓冲区,.NET 甚至可能在 API 级别实现缓冲区,这意味着除非你告诉 class "Now I'm done",它永远不知道何时确保这些缓冲区一直传播到盘片。

您应该稍微重写您的代码,如下所示:

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

using (...) { ... } 将确保当代码离开块时,即 { ... } 部分,它将对对象调用 IDisposable.Dispose,在这种情况下将刷新缓冲区并关闭基础文件。