2017-02-21 4 views
0

保存/読み込み機能(個人データなど)を持つアプリケーションを作成しました。アプリケーションが実行されているときは、データの保存と読み込みがうまく機能します。残念ながら、アプリケーションを再オープンした後、保存されたデータは消え、ファイルを開こうとするとnull参照例外が発生します。設定(ツール - >オプション - > xamarin)で、 "デプロイ間でアプリケーションデータ/キャッシュを保持する"チェックボックスをオンにしました。以下は私のI/O機能です:Xamarin Androidアプリを再開した後のデータが失われました

public void SerializeObject(T obj) 
    {    
     string jsonData = JsonConvert.SerializeObject(obj); 
     JsonSerializer serializer = new JsonSerializer(); 
     serializer.NullValueHandling = NullValueHandling.Ignore; 
     var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
     var filePath = Path.Combine(documentsPath, "data.txt"); 
     System.IO.File.WriteAllText(filePath, jsonData); 
    } 
    public T DeSerializeObject() 
    { 
     var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
     var filePath = Path.Combine(documentsPath, "data.txt"); 
     string text = System.IO.File.ReadAllText(filePath); 
     T obj = JsonConvert.DeserializeObject<T>(text); 
     return obj; 
    } 

編集:以下データを保存Button.click機能です。私は問題を発見した

private void saveButtonClick(object sender, EventArgs e) 
    {    
     _data.x = this.x; 
     _data.y = this.y; 
     _data.z = this.z; 
     IOoperation<Data> save = new IOoperation<Data>(); 
     save.SerializeObject(_data); 
     TextView _current = FindViewById<TextView>(Resource.Id.currentPositionTextView); 
     _current.Text = string.Format("Saved position: {0}, {1}, {2}", _data.x, _data.y, _data.z); 
    } 

    private void loadButtonClick(object sender, EventArgs e) 
    { 
     IOoperation<Data> load = new IOoperation<Data>();    
     Data obj = load.DeSerializeObject(); 

     TextView _current = FindViewById<TextView>(Resource.Id.currentPositionTextView); 
     _current.Text = string.Format("Saved position: {0}, {1}, {2} - loaded", _data.x, _data.y, _data.z); 
    } 
+0

.File.WriteAllTextは、新しいエントリのみを使用して新しいファイルを作成します。 nオブジェクトをDeSerializeしようとしました。このシナリオでは、エントリは1つしかありません。あなたは、あなたがそこにいると予想されるものを潜在的に上書きしているのですか、あるいは複数の項目を返すために逆直列化を期待していますか? https://msdn.microsoft.com/en-us/library/system.io.file.writealltext(v=vs.110).aspx –

+0

問題を再現できません。[デモ](https: //github.com/mikexxma/SpecialFolder.Personal_Demo.git)をコードと一緒に使用すると、アプリケーションを再度開くと正常に動作します。 –

+0

ファイルを新しいデータで上書きするのは簡単です。 @MikeMa私は自分の投稿を編集しましたが、追加のコードがあります。多分何かが間違っているかもしれない。 – krawat10

答えて

0

_current.Text = string.Format("Saved position: {0}, {1}, {2} - loaded", _data.x, _data.y, _data.z);

アプリ_dataを再開するときは、データを取得するためにobjを使用してくださいnullです

System.IOを使用して

_current.Text = string.Format("Saved position: {0}, {1}, {2} - loaded", obj.x, obj.y, obj.z);

+0

すべて機能します!ありがとう! – krawat10

関連する問題