Come posso archiviare un array di oggetti personalizzati?

Ho creato un arraylist composto da oggetti personalizzati. Fondamentalmente l’utente crea una class e ogni volta che viene creata una class, una nuova conferenza (il mio object personalizzato) viene aggiunta all’arrayist. Devo salvare l’array generato in modo che le classi dell’utente vengano salvate anche quando l’app viene riavviata.

Dalla mia comprensione, devo rendere la mia class serializzabile. Ma esattamente come lo faccio? E poi una volta serializzato cosa faccio?

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 

Sei fortunato, tutti i membri della tua class sono già serializzabili quindi il tuo primo passo è dire che la lezione è serializzabile.

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

Successivamente, è necessario creare un costruttore predefinito poiché la serializzazione sembra richiedere questo. L’ultima cosa è che devi scrivere il tuo object in un file. Di solito uso qualcosa come il seguente. Nota: questo è per salvare uno stato di gioco, quindi potresti non voler usare la directory della cache.

 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 */ } } } 

Leggere i dati è abbastanza simmetrico rispetto alla scrittura, quindi l’ho lasciato fuori per questa risposta. Inoltre, ci sono ancora molti avvertimenti sugli oggetti serializzati, quindi ti suggerisco di fare alcune ricerche su Google e di leggere la serializzazione Java in generale.

Uso una class in un’app Meteo che sto sviluppando …

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

Per salvare uso codice come questo …

 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: Prima di scrivere gli oggetti Region, scrivo un int per salvare la ‘dimensione’ dell’elenco.

Quando rileggo faccio questo …

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

Usa System.Runtime.Serialization. Puoi vedere un esempio qui: http://blog.kowalczyk.info/article/Serialization-in-C.html