【问题标题】:Async File Deserialization异步文件反序列化
【发布时间】:2013-08-06 17:09:58
【问题描述】:

我在使用我的第一个 Windows 应用商店应用程序,但在反序列化/加载我的应用程序数据时遇到了一些问题。

我正在使用 JSon 将我的类对象序列化为字符串,然后将其保存到 Application Local App 文件夹中。

当需要加载数据时,曾经加载在运行时失败,并且没有加载任何数据。我的类被实例化为一个新类。

但是当我在调试模式下运行我的代码步骤时。反序列化工作正常,我的类已正确加载。

我认为问题出在我的异步实现上。但我不知道在哪里。

有人可以帮我吗?

保存过程:

public virtual void Save()
{
     var data = JsonConvert.SerializeObject(this);
     WriteTotextFileAsync("Cashier.Data.Config", data);
}

public static async void WriteTotextFileAsync(string fileName, string contents)
{
     var folder = ApplicationData.Current.LocalFolder;
     var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
     await FileIO.WriteTextAsync(file, contents);
}

加载过程:

private async void LoadConfig()
{
    string data;
    if (Config == null)
    {
        data = await ReadTextFileAsync("Cashier.Data.Config");//.ConfigureAwait(false);
        if (data != null && data.Length > 0)
            try
            {
                System.Diagnostics.Debug.WriteLine(data);
                Config = JsonConvert.DeserializeObject<Data.Config>(data);
                System.Diagnostics.Debug.WriteLine(data);
            }
            catch (Exception ex)
            {
                var dlg = new MessageDialog("Desirialization erreur" + Environment.NewLine + ex.Message);
                dlg.ShowAsync();
                Config = new Config();
            }
        else
        {
            System.Diagnostics.Debug.WriteLine("Config = new Config();");
            Config = new Config();
        }
    }
}

public static async Task<string> ReadTextFileAsync(string path)
{
    var folder = ApplicationData.Current.LocalFolder;
    try
    {
        var file = await folder.GetFileAsync(path);
        var value = await FileIO.ReadTextAsync(file);
        return value;
    }
    catch (System.IO.FileNotFoundException ex)
    {
        return string.Empty;
    }
}

【问题讨论】:

    标签: c# wpf microsoft-metro windows-store-apps async-await


    【解决方案1】:

    你应该避免async void。将您的 LoadConfigSave 方法更改为 async Task 方法,并将您的调用代码 await 作为它们返回的任务。

    async void 的一个问题是调用代码不知道何时完成。例如,调用LoadConfig 的代码不知道实际加载配置的时间。通过使LoadConfig 返回一个Task,然后调用代码可以await 那个Task 并知道该任务完成时配置已加载。

    【讨论】:

    • 感谢您的回复,我已经按照您的建议进行了异步和任务,但它并没有改变行为。哪里是调用保存设置过程的最佳位置?在 App.xaml.cs 的“OnSuspending”事件中?
    【解决方案2】:

    我终于喜欢出了什么问题。当我反序列化字符串时,我将它转换为错误的对象类类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多