Guardar / cargar datos en Unity

He estado jugando con guardar y cargar en Unity en el que guardo una clase serializada en un archivo. Tengo una clase Serializable:

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

y guárdelo en un archivo A-OK. Puedo cargarlo sin errores, pero si quería agregarlo más tarde:

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

y ejecuto mis scripts me da un error de deserialización que entiendo completamente, ya que cuando echo el archivo deserializado a mi nueva clase ‘Saved’, la nueva variable que agregué no existe y me da el error.

Encontré este error cuando estaba arreglando un activo en la tienda y sé que una solución puede ser simplemente cambiar el nombre del archivo para que se cree un nuevo archivo, pero no solo quiero borrar el contenido de lo que se guardó antes.

Entonces, mi pregunta es, si quisiera agregar más variables a mi clase serializada, ¿cómo puedo capturar y ajustar las versiones anteriores si las personas deben actualizar el activo?

¡Gracias!

Este problema se conoce cuando se usa el serializador C #. Convierta los datos a Json con JsonUtility y guárdelos con PlayerPrefs . Al cargar, cargue con PlayerPrefs luego convierta el json a clase con JsonUtility .

Clase de ejemplo para guardar:

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

Guardar datos :

 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(); } 

Cargar datos :

 void Load() { //Load saved Json string jsonData = PlayerPrefs.GetString("MySettings"); //Convert to Class Save loadedData = JsonUtility.FromJson(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]); } } 

Diferencia entre JsonUtility.FromJson y JsonUtility.FromJsonOverwrite :

A JsonUtility.FromJson crea un nuevo objeto de Json y lo devuelve. Asigna memoria.

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

B. JsonUtility.FromJsonOverwrite no crea un nuevo objeto. No tiene nada que ver con agregar más tipo de datos a su clase. Simplemente sobrescribe los datos que se pasan en él. Es bueno para la conservación de la memoria y menos GC. La única vez que asignará memoria si tiene campos tales como array , string y List .

Un ejemplo de dónde se debe usar JsonUtility.FromJsonOverwrite es cuando se realiza una transferencia de datos constante con Json. Mejorará el rendimiento.

 //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); }