2017-02-21 30 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

相关问题