Подтвердить что ты не робот

Как я могу хранить 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
4b9b3361

Ответ 1

Вам повезло, все члены вашего класса уже сериалы, поэтому ваш первый шаг - сказать, что Lecture 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;
    }

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

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-сериализации в целом.

Ответ 2

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

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

ПРИМЕЧАНИЕ. Прежде чем писать объекты Region, я пишу 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();