2017-03-12 4 views
0

Visual Studio Community 2015を使用してUWPで日記アプリケーションを作成しようとしています。したがって、すべての日記エントリはObservableCollection(DiaryEntryタイプの3つの文字列)に保持されます。 AppクラスのOnSuspendingメソッドでは、(XmlSerializerを使用して)シリアル化し、ObservableCollectionをアプリケーションのLocalFolderに保存します。 AppクラスのOnLaunchedメソッドでは、データを逆シリアル化してObservableCollectionに再度配置します。UWPがリリースモードでシリアル化データを失う

このアプリケーションをデバッグモードで実行すると、毎回100%動作しますが、リリースモードでは、アプリケーションを閉じて再度開くとObservableCollectionが失われます。それ以外の場合は1回か2回は動作しますが、データは失われます。私が知りたいことは、私のアプリをリリースモードで動作させるにはどうすればいいのですか?

 private async void SaveCollection(string xml) 
    { 
     //Serializing our observablecollection and saving it to the local folder 
     StorageFile sf = await ApplicationData.Current.LocalFolder.CreateFileAsync("Diary.txt", CreationCollisionOption.ReplaceExisting); 
     await Windows.Storage.FileIO.WriteTextAsync(sf, xml); 

    } 

    private async Task<string> GetSavedCollection() 
    { 
     try 
     { 
      Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
      Windows.Storage.StorageFile sampleFile = await storageFolder.GetFileAsync("Diary.txt"); 

      string text = await Windows.Storage.FileIO.ReadTextAsync(sampleFile); 

      return text; 
     } 
     catch (FileNotFoundException e) 
     { 
      return ""; 
     } 

    } 

    public static string ToXml(ObservableCollection<DiaryEntry> d) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<DiaryEntry>)); 
     StringBuilder stringBuilder = new StringBuilder(); 
     XmlWriterSettings settings = new XmlWriterSettings() 
     { 
      Indent = true, 
      OmitXmlDeclaration = true, 
     }; 

     using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, settings)) 
     { 
      serializer.Serialize(xmlWriter, d); 
     } 
     return stringBuilder.ToString(); 
    } 

    // Deserialize from xml 
    public static ObservableCollection<DiaryEntry> FromXml(string xml) 
    { 
     if (xml == "") 
     { 
      return new ObservableCollection<DiaryEntry>(); 
     } 

     XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<DiaryEntry>)); 
     ObservableCollection<DiaryEntry> value; 
     using (StringReader stringReader = new StringReader(xml)) 
     { 
      object deserialized = serializer.Deserialize(stringReader); 
      value = (ObservableCollection<DiaryEntry>)deserialized; 
     } 

     return value; 
    } 

これは私がこれらのメソッドを呼び出す方法をされています:

これらは私が使用しています方法がある

日記= FromXml(GetSavedCollectionを待ちます());

SaveCollection(ToXml(Diaries));

+0

データ処理の保存中にログを書き込もうとします。 – WPInfo

+0

'NETCore.UniversalWindowsPlatform'はどちらを使いますか?最も高くなるようにしてください。 (5.3.1)。おそらく、この問題は.NETネイティブツールチェーンに関連しています。 –

+0

アプリのビルド設定で '.NETネイティブツールチェーン'オプションが有効になっている場合は、 'Microsoft.NETNative.Analyzer'を使用してください。したがって、コンパイラーで互換性のないコードを見ることができます。 NuGetパッケージはこちら=> https://www.nuget.org/packages/Microsoft.NETNative.Analyzer/ –

答えて

0

それはあなたのコードのフルREPROなし確かに言うのは難しいです(https://stackoverflow.com/help/mcveを参照)が、私はそれがアプリのライフサイクルの誤解とどこがOnLaunchedOnSuspendingメソッドにコードを追加して行うことだと思います。

ライフサイクルを理解するには、the docs herethis blog articleを参照してください。

これらのメソッドは、

最初にOnSuspendingを扱いましょう。あなたはdeferral.Complete();SaveCollectionを呼び出している場合、それはアプリが終了する前に終了しない場合があり、OnLaunching方法がよりある

を持っていないの原因となりうること

private void OnSuspending(object sender, SuspendingEventArgs e) 
{ 
    var deferral = e.SuspendingOperation.GetDeferral(); 

    SaveCollection(ToXml(Diaries)); 

    deferral.Complete(); 
} 

注:あなたのコードは次のようになります。複雑です。テンプレートでのTODOコメントに基づいて行うことを

if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 
{ 
    //TODO: Load state from previously suspended application 
    Diaries = FromXml(await GetSavedCollection()); 
} 

これは論理的なものに見えるかもしれませんが、再起動するときは、常にディスクからロードしたいあなたのシナリオのために右ではありません。私はあなたがこのようなコードを持っている疑いがありますアプリ。例えば、アプリが以前にユーザーによって閉じると、コンテンツが読み込まれることはありません。私はあなたも日記の項目を読み込むと思っています。 (あなたは完全な再現手順を提供していないので、あなたが見ている振る舞いをどのようにテストし再現しているか正確には分かりません)

代わりに、 。

if (Diaries == null) 
{ 
    Diaries = FromXml(await GetSavedCollection()); 
} 

if (e.PrelaunchActivated == false) 

OR

それはあなたが定義したとSaveCollectionを呼び出しているかとの問題です。

SaveCollectionasync voidと定義しました。これは悪いです。 async voidでなければならないものは、イベントハンドラだけです。あなたはasync Taskとしてそれを定義し、それへの呼び出しを待っている必要があります:それは正しく完了しない場合があり、このコールを待たずに

private async Task SaveCollection(string xml) 
{ 
    System.Diagnostics.Debug.WriteLine(xml); 

    //Serializing our observablecollection and saving it to the local folder 
    StorageFile sf = await ApplicationData.Current.LocalFolder.CreateFileAsync("Diary.txt", CreationCollisionOption.ReplaceExisting); 
    await Windows.Storage.FileIO.WriteTextAsync(sf, xml); 
} 


await SaveCollection(ToXml(Diaries)); 

を。 .NetNativeのコンパイルでは、この動作がより明白であることは私を驚かせるものではありません。

または両方の問題の組み合わせかもしれません。

関連する問題