2
    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了,仍然有同样的问题。

4

2 回答 2

0

我在我的项目中遇到了同样的问题。我在调用 SaveFileAsync 之前添加了await关键字。我不再在 App.xaml.cs 的 OnSuspending 处理程序中调用此方法,它现在可以工作。

于 2013-03-18T14:40:59.767 回答
0

正如 Jerry 指出的,这可能是一个锁定问题。它也可能是一种竞争条件(我们看不到调用这些方法的代码,因此请确保在另一个已经运行时不能调用其中一个)。

我看到的一个潜在领域是这两行:

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

于 2013-02-18T19:50:29.227 回答