2010-12-09 10 views
14

He creado una lista de arrays formada por objetos personalizados. Básicamente, el usuario creará una clase y cada vez que se crea una clase, se agrega una nueva Conferencia (mi objeto personalizado) a la lista de arrays. Necesito guardar el arraylist generado para que las clases del usuario se guarden incluso cuando se reinicie la aplicación.¿Cómo puedo almacenar una lista de arrays de objetos personalizados?

Según tengo entendido, tengo que hacer que mi clase sea serializable. ¿Pero cómo exactamente hago eso? Y luego, una vez que se serializó, ¿qué hago?

public class Lecture{ 

public String title; 
public String startTime; 
public String endTime; 
public String day; 
public boolean classEnabled; 

public Lecture(String title, String startTime, String endTime, String day, boolean enable){ 
    this.title = title; 
    this.startTime = startTime; 
    this.endTime = endTime; 
    this.day = day; 
    this.classEnabled = enable; 
} 
//Getters and setters below 

Respuesta

11

Estás de suerte, todos los de su clase miembros ya están serialzble por lo que su primer paso es decir que Conferencia es Serializable.

public class Lecture implements Serializable { 

    public String title; 
    public String startTime; 
    public String endTime; 
    public String day; 
    public boolean classEnabled; 

    public Lecture(String title, String startTime, String endTime, String day, boolean enable){ 
     this.title = title; 
     this.startTime = startTime; 
     this.endTime = endTime; 
     this.day = day; 
     this.classEnabled = enable; 
    } 

A continuación, debe crear un constructor predeterminado ya que la serialización parece requerir eso. Lo último es que necesita escribir su objeto en un archivo. Usualmente uso algo como lo siguiente. Tenga en cuenta que esto es para guardar un estado del juego, por lo que es posible que no desee utilizar el directorio de caché.

private void saveState() { 
    final File cache_dir = this.getCacheDir(); 
    final File suspend_f = new File(cache_dir.getAbsoluteFile() + File.separator + SUSPEND_FILE); 

    FileOutputStream fos = null; 
    ObjectOutputStream oos = null; 
    boolean   keep = true; 

    try { 
     fos = new FileOutputStream(suspend_f); 
     oos = new ObjectOutputStream(fos); 

     oos.writeObject(this.gameState); 
    } 
    catch (Exception e) { 
     keep = false; 
     Log.e("MyAppName", "failed to suspend", e); 
    } 
    finally { 
     try { 
      if (oos != null) oos.close(); 
      if (fos != null) fos.close(); 
      if (keep == false) suspend_f.delete(); 
     } 
     catch (Exception e) { /* do nothing */ } 
    } 
} 

La lectura de los datos es bastante simétrica a la escritura, así que lo dejé para esta respuesta. Además, todavía hay muchas advertencias sobre los objetos serializados, por lo que te sugiero que hagas algunas búsquedas en Google y leas en general la serialización de Java.

+0

Explicando menos, he buscado en Google la que se encuentra su respuesta! – l0gg3r

13

utilizo una clase en una aplicación de tiempo que estoy desarrollando ...

public class RegionList extends ArrayList<Region> {} // Region implements Serializeable 

Para guardar utilizo código como este ...

FileOutputStream outStream = new FileOutputStream(Weather.WeatherDir + "/RegionList.dat"); 
ObjectOutputStream objectOutStream = new ObjectOutputStream(outStream); 
objectOutStream.writeInt(uk_weather_regions.size()); // Save size first 
for(Region r:uk_weather_regions) 
    objectOutStream.writeObject(r); 
objectOutStream.close(); 

NOTA: Antes de escribir la Región objetos, escribo un int para guardar el 'tamaño' de la lista.

Cuando leí de arriba hago esto ...

FileInputStream inStream = new FileInputStream(f); 
ObjectInputStream objectInStream = new ObjectInputStream(inStream); 
int count = objectInStream.readInt(); // Get the number of regions 
RegionList rl = new RegionList(); 
for (int c=0; c < count; c++) 
    rl.add((Region) objectInStream.readObject()); 
objectInStream.close(); 
Cuestiones relacionadas