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 が指摘したように、これはロックの問題である可能性があります。競合状態の可能性もあります (これらのメソッドを呼び出すコードは表示されません。そのため、一方が既に実行されている間は他方が呼び出されないようにしてください)。

私が見ている 1 つの潜在的な領域は、次の 2 つの行です。

storageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName,
        CreationCollisionOption.ReplaceExisting);
    using (Stream stream = await file.OpenStreamForWriteAsync())

このコードでは、あるステップでファイルを作成し (必要に応じて上書きします)、別のステップでファイルを開きます。あなたは待っているので、ここでは何も問題はありませんが、空のファイルで終わる場合は、これらの 2 行の間で失敗する可能性があることは理にかなっています。ファイルが存在しない場合はファイルを作成し、存在する場合は上書きできる OpenStreamForWriteAsync のオーバーロードがあることが判明しました。この 2 つのステップを 1 つにまとめることができます。

http://msdn.microsoft.com/en-us/library/hh582148.aspx

最後に (これはあなたの問題とは何の関係もないと思います)、メモリ ストリームを完全にスキップできます。DataContractSerializer は FileStream に直接書き込むことができます。数行のコードとメモリ フットプリントを節約することもできます。

それが役立つことを願っています。理解できたらお知らせください。

開発サポート、設計サポート、その他の優れた機能が進行中: http://bit.ly/winappsupport

于 2013-02-18T19:50:29.227 に答える