我是第一个Windows应用商店应用,我遇到了反序列化/加载应用数据的问题。
我正在使用JSon将我的类对象序列化为字符串,然后将其保存到Application Local App文件夹。
当需要加载数据时,曾几何时加载在运行时失败,并且没有加载数据。我的类被实例化为一个新类。
但是当我运行我的代码时,我步进调试模式。 Desirialization工作正常,我的课程已正确加载。
我认为问题来自我的异步实现。但我不知道在哪里。
有人可以帮助我吗?
保存程序:
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;
}
}
答案 0 :(得分:6)
你应该避免async void
。将您的LoadConfig
和Save
方法更改为async Task
方法,并将您的调用代码await
作为他们返回的任务。
async void
的一个问题是调用代码在完成后无法知道。例如,调用LoadConfig
的代码不知道配置何时实际加载。通过使LoadConfig
返回Task
,调用代码可以await
Task
并且知道在该任务完成时加载了配置。
答案 1 :(得分:0)
我终于找到了什么问题。当我反序列化字符串时,我将它转换为错误的对象类类型。