在Unity中保存/加载数据

我一直在保存和加载在Unity中保存一个序列化的类到一个文件。 我有一个Serializable类:

[Serializable] class Save { public List<int> ID = new List<int>(); public List<int> Amounts = new List<int>(); } 

并将其保存到文件A – 确定。 我可以加载它没有错误,但如果我想以后添加:

 [Serializable] class Save { public List<int> ID = new List<int>(); public List<int> Amounts = new List<int>(); public int extra = 0; } 

我运行我的脚本它给了我一个反序列化错误,我完全理解,因为当我把反序列化的文件到我的新类“保存”我添加的新variables不存在,它给了我错误。

我在修复商店中的资产时发现了这个错误,我知道一个修正可能只是更改文件名,以便创build一个新文件,但是我不只是想擦掉以前保存的内容。

所以我的问题是,如果我想添加更多的variables到我的序列化的类,如果人们更新资产,我会如何捕获和调整旧版本的?

谢谢!

使用C#序列化器时,这个问题是已知的。 使用JsonUtility将数据转换为Json,然后使用JsonUtility进行保存。 加载时,使用PlayerPrefs进行加载,然后使用PlayerPrefs将json转换回类。

保存的示例类:

 [Serializable] public class Save { public List<int> ID = new List<int>(); public List<int> Amounts = new List<int>(); public int extra = 0; public float highScore = 0; } 

保存数据

 void Save() { Save saveData = new Save(); saveData.extra = 99; saveData.highScore = 40; //Convert to Json string jsonData = JsonUtility.ToJson(saveData); //Save Json string PlayerPrefs.SetString("MySettings", jsonData); PlayerPrefs.Save(); } 

加载数据

 void Load() { //Load saved Json string jsonData = PlayerPrefs.GetString("MySettings"); //Convert to Class Save loadedData = JsonUtility.FromJson<Save>(jsonData); //Display saved data Debug.Log("Extra: " + loadedData.extra); Debug.Log("High Score: " + loadedData.highScore); for (int i = 0; i < loadedData.ID.Count; i++) { Debug.Log("ID: " + loadedData.ID[i]); } for (int i = 0; i < loadedData.Amounts.Count; i++) { Debug.Log("Amounts: " + loadedData.Amounts[i]); } } 

JsonUtility.FromJsonJsonUtility.FromJsonOverwrite之间的JsonUtility.FromJsonOverwrite

A。 JsonUtility.FromJson从Json创build新的对象并返回它。 它分配内存。

 string jsonData = PlayerPrefs.GetString("MySettings"); //Convert to Class. FromJson creates new Save instance Save loadedData = JsonUtility.FromJson<Save>(jsonData); 

B。 JsonUtility.FromJsonOverwrite不会创build新的Object。 它与添加更多的数据types到你的class级无关。 它只是覆盖在它传递的数据。 这对记忆保护和GC不太好。 只有当你有arraystringList等字段时,才会分配内存。

应该使用JsonUtility.FromJsonOverwrite示例是使用Json执行常量数据传输时的示例。 它会提高性能。

 //Create Save instance **once** in the Start or Awake function Save loadedData = null; void Start() { //loadedData instance is created once loadedData = new Save(); } void Load() { string jsonData = PlayerPrefs.GetString("MySettings"); //Convert to Class but don't create new Save Object. Re-use loadedData and overwrite old data in it JsonUtility.FromJsonOverwrite(jsonData, loadedData); Debug.Log("High Score: " + loadedData.highScore); }