2010-12-09 5 views
14

Я создал arraylist, который состоит из пользовательских объектов. В основном пользователь будет создавать класс, и каждый раз, когда создается класс, в arraylist добавляется новая лекция (мой пользовательский объект). Мне нужно сохранить созданный arraylist, чтобы классы пользователя были сохранены даже при перезапуске приложения.Как я могу сохранить arraylist пользовательских объектов?

С моей точки зрения, я должен сделать свой класс сериализуемым. Но как именно я это делаю? А потом, как только его сериализовать, что мне делать?

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 

ответ

11

Вы находитесь в удаче, все из вашего класса члены уже serialzble так что ваш первый шаг, чтобы сказать, что Лекция сериализует.

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

Далее необходимо создать конструктор по умолчанию, поскольку для его сериализации требуется такое. Последнее, что вам нужно написать свой объект в файл. Обычно я использую что-то вроде следующего. Обратите внимание, что это для сохранения состояния игры, поэтому вы можете не использовать каталог кеша.

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

Чтение данных назад довольно симметрично для записи, поэтому я оставил это для ответа. Кроме того, по-прежнему существует много предостережений для объектов Serialized, поэтому я предлагаю вам выполнить некоторые поисковые запросы Google и прочитать о Java-сериализации в целом.

+0

Объясняя минус, я гугл, что нашел ответ на свой вопрос! – l0gg3r 2014-03-15 15:34:50

13

Я использую класс в приложении Погода я разрабатываю ...

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

Чтобы сохранить Я использую такой код ...

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

Примечание: Перед тем, как написать область объекты, я пишу int, чтобы сохранить «размер» списка.

Когда я прочитал назад я это делаю ...

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(); 
Смежные вопросы