我創建了具有保存/加載功能(個人數據等)的應用程序。當應用程序運行時,保存和加載數據的效果很好。不幸的是,重新打開應用程序後,存儲的數據消失,當我嘗試打開文件時,我有一個空引用異常。在設置中(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);
}
使用System.IO .File.WriteAllText將創建一個只有新條目可用的新文件ñ你嘗試DeSerialize對象。在這種情況下,只會有一個條目。你是否可能覆蓋你期望在那裏或期待反序列化返回多個條目? https://msdn.microsoft.com/en-us/library/system.io.file.writealltext(v=vs.110).aspx –
我無法重現您的問題,我創建了一個[demo](https: //github.com/mikexxma/SpecialFolder.Personal_Demo.git)與你的代碼,當我重新打開應用程序時,它工作正常。 –
我想簡單地用新數據覆蓋我的文件。 @MikeMa我編輯了我的文章,還有一個額外的代碼。也許有什麼問題。 – krawat10