0

初めての 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;
    }
}
4

2 に答える 2

6

避けるべきasync voidです。LoadConfigメソッドとSaveメソッドをメソッドに変更しasync Task、呼び出し元awaitのコードをそれらが返すタスクにします。

の 1 つの問題async voidは、呼び出し元のコードがいつ完了したかを認識できないことです。たとえば、呼び出すコードは、LoadConfig構成が実際にいつロードされるかを知りません。LoadConfigreturn を にすることTaskで、呼び出し元のコードは、そのタスクが完了したときに構成が読み込まれていることを認識awaitできます。Task

于 2013-08-06T17:17:03.090 に答える