2017-02-21 66 views
0

我創建了具有保存/加載功能(個人數據等)的應用程序。當應用程序運行時,保存和加載數據的效果很好。不幸的是,重新打開應用程序後,存儲的數據消失,當我嘗試打開文件時,我有一個空引用異常。在設置中(tools-> option-> 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

使用System.IO .File.WriteAllText將創建一個只有新條目可用的新文件ñ你嘗試DeSerialize對象。在這種情況下,只會有一個條目。你是否可能覆蓋你期望在那裏或期待反序列化返回多個條目? https://msdn.microsoft.com/en-us/library/system.io.file.writealltext(v=vs.110).aspx –

+0

我無法重現您的問題,我創建了一個[demo](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);

當重新打開應用程序_datanull請用obj來獲取數據:

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

+0

一切正常!謝謝! – krawat10

相關問題