2010-11-07 13 views
101

Digamos que tengo una clase simple y una vez que se crea una instancia como objeto, quiero serializar su contenido en un archivo y recuperarlo cargando ese archivo más adelante ... No estoy seguro de dónde empezar aquí, ¿qué debo hacer para serializar este objeto en un archivo?¿Cómo serializo un objeto y lo guardo en un archivo en Android?

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, ya que esta es una tarea muy simple en .NET, pero en Android estoy bastante nuevo, así que estoy completamente perdido.

Respuesta

217

ahorro de energía (w/o código de control de excepciones):

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

Carga (w/o código de control de excepciones):

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

Muy útil. ¿Podría explicarnos por favor si tenemos que serializar la clase para escribir como el archivo objeto? –

+4

Esta funcionalidad se agrega implícitamente a su clase si usa la interfaz Serializable. Si todo lo que quieres es una serialización simple de objetos, eso es lo que usaría. Es extremadamente fácil de implementar también. http://developer.android.com/reference/java/io/Serializable.html – mtmurdock

+5

+1, para el almacenamiento de varios objetos hay un truco requerido: http://stackoverflow.com/a/1195078/1321401 – Luten

30

He intentado esto 2 opciones (lectura/escritura) , con objetos lisos, matriz de objetos (150 objetos), Mapa:

Option1:

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

Opción 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(); 

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

El inconveniente opción 2 es que usted tiene que hacer que el código específico de analisis:

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); 
4

Se completa el código con el manejo de errores y se cierra el flujo de archivos agregado. 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 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; 
} 

utilizar de esta manera en su Activity:

form = CreateResumeForm.readFromFile(this); 
6

acabo de hacer una clase para manejar esto con los genéricos, por lo que se puede utilizar con todos los tipos de objetos que son serializable:

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 <T> The type of the object. 
    */ 

    public static <T extends Serializable> 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 <T> The object type. 
    * 
    * @return the serializable object. 
    */ 

    public static<T extends Serializable> 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); 
    } 

} 
Cuestiones relacionadas