¿Cómo serializo un objeto y lo guardo en un archivo en Android?

Digamos que tengo una clase simple y una vez que se crea una instancia como objeto, quiero poder serializar su contenido en un archivo y recuperarlo cargando ese archivo en algún momento posterior … No estoy seguro de por dónde empezar, ¿Qué debo hacer para serializar este objeto en un archivo?

public class SimpleClass { public string name; public int id; public void save() { /* wtf do I do here? */ } public static SimpleClass load(String file) { /* what about here? */ } } 

Esta es probablemente la pregunta más fácil del mundo, porque esta es una tarea realmente simple en .NET, pero en Android soy bastante nuevo, así que estoy completamente perdido.

Ahorro (sin código de manejo de excepciones):

 FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); ObjectOutputStream os = new ObjectOutputStream(fos); os.writeObject(this); os.close(); fos.close(); 

Cargando (sin código de manejo de excepciones):

 FileInputStream fis = context.openFileInput(fileName); ObjectInputStream is = new ObjectInputStream(fis); SimpleClass simpleClass = (SimpleClass) is.readObject(); is.close(); fis.close(); 

He intentado estas 2 opciones (lectura / escritura), con objetos simples, una matriz de objetos (150 objetos), un mapa:

Opción 1:

 FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); ObjectOutputStream os = new ObjectOutputStream(fos); os.writeObject(this); os.close(); 

Opcion 2:

 SharedPreferences mPrefs=app.getSharedPreferences(app.getApplicationInfo().name, Context.MODE_PRIVATE); SharedPreferences.Editor ed=mPrefs.edit(); Gson gson = new Gson(); ed.putString("myObjectKey", gson.toJson(objectToSave)); ed.commit(); 

La opción 2 es dos veces más rápida que la opción 1

La opción 2 es que tiene que hacer un código específico para leer:

 Gson gson = new Gson(); JsonParser parser=new JsonParser(); //object arr example JsonArray arr=parser.parse(mPrefs.getString("myArrKey", null)).getAsJsonArray(); events=new Event[arr.size()]; int i=0; for (JsonElement jsonElement : arr) events[i++]=gson.fromJson(jsonElement, Event.class); //Object example pagination=gson.fromJson(parser.parse(jsonPagination).getAsJsonObject(), Pagination.class); 

Acabo de hacer una clase para manejar esto con Generics, por lo que se puede usar con todos los tipos de objetos que son serializables:

 public class SerializableManager { /** * Saves a serializable object. * * @param context The application context. * @param objectToSave The object to save. * @param fileName The name of the file. * @param  The type of the object. */ public static  void saveSerializable(Context context, T objectToSave, String fileName) { try { FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(objectToSave); objectOutputStream.close(); fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } /** * Loads a serializable object. * * @param context The application context. * @param fileName The filename. * @param  The object type. * * @return the serializable object. */ public static T readSerializable(Context context, String fileName) { T objectToReturn = null; try { FileInputStream fileInputStream = context.openFileInput(fileName); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); objectToReturn = (T) objectInputStream.readObject(); objectInputStream.close(); fileInputStream.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return objectToReturn; } /** * Removes a specified file. * * @param context The application context. * @param filename The name of the file. */ public static void removeSerializable(Context context, String filename) { context.deleteFile(filename); } } 

Se cierra el código completo con manejo de errores y la secuencia de archivos añadidos. Añádalo a su clase que quiera serializar y deserializar. En mi caso, el nombre de clase es CreateResumeForm . Debe cambiarlo a su propio nombre de clase. Android interfaz de Android Serializable no es suficiente para guardar sus objetos en el archivo, solo crea secuencias.

 // Constant with a file name public static String fileName = "createResumeForm.ser"; // Serializes an object and saves it to a file public void saveToFile(Context context) { try { FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(this); objectOutputStream.close(); fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } // Creates an object by reading it from a file public static CreateResumeForm readFromFile(Context context) { CreateResumeForm createResumeForm = null; try { FileInputStream fileInputStream = context.openFileInput(fileName); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); createResumeForm = (CreateResumeForm) objectInputStream.readObject(); objectInputStream.close(); fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return createResumeForm; } 

Úselo así en su Activity :

 form = CreateResumeForm.readFromFile(this);