public static async Task SaveFileAsync(string FileName, T data)
{
MemoryStream memStream = new MemoryStream();
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(memStream, data);
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
CreationCollisionOption.ReplaceExisting);
using (Stream stream = await file.OpenStreamForWriteAsync())
{
memStream.Seek(0, SeekOrigin.Begin);
await memStream.CopyToAsync(stream);
await stream.FlushAsync();
}
}
public static async Task<T> RestoreFileAsync(string FileName)
{
T result = default(T);
try
{
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(FileName);
using (IInputStream inStream = await file.OpenSequentialReadAsync())
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
result = (T)serializer.ReadObject(inStream.AsStreamForRead());
return result;
}
}
catch (FileNotFoundException)
{
return default(T);
}
}
我正在使用此代码来保存和检索我的数据,并且工作正常。
将数据保存在本地文件中并启动我的应用程序后,有时没有数据。
我将我的数据保存为.xml
文件。
每次保存时都会检查文件,并且保存了内容。 但有时它会删除它,我不知道为什么。
我尝试了DataContractJsonSerializer
但仍有同样的问题。
答案 0 :(得分:0)
杰瑞指出,这可能是一个锁定问题。它也可能是竞争条件(我们没有看到您调用这些方法的代码,因此请确保在另一个已经运行时无法调用它)。
我看到的一个潜在领域是这两行:
storageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
CreationCollisionOption.ReplaceExisting);
using (Stream stream = await file.OpenStreamForWriteAsync())
在此代码中,您只需一步创建文件(必要时覆盖),然后在另一步中打开文件。你正在等待,所以我在这里看不出任何错误,但是如果你最终得到一个空文件,这可能是这两行之间的失败。事实证明,OpenStreamForWriteAsync存在重载,如果文件不存在则允许您创建文件,如果存在则覆盖它。您可以将这两个步骤合并为一个。
http://msdn.microsoft.com/en-us/library/hh582148.aspx
最后(我认为这与你的问题无关)你可以完全跳过内存流。 DataContractSerializer可以直接写入FileStream。不妨为自己节省几行代码和内存占用。
我希望有所帮助。如果你明白了,请告诉我们。
开发人员的支持,设计支持和更加出色的善意:http://bit.ly/winappsupport
答案 1 :(得分:0)
我的项目中遇到了同样的问题。我在调用SaveFileAsync之前添加了等待关键字。我不再在App.xaml.cs的OnSuspending处理程序中调用此方法,它现在可以正常工作。