Как я могу хранить массив пользовательских объектов? - PullRequest
14 голосов
/ 09 декабря 2010

Я создал 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

Ответы [ 3 ]

13 голосов
/ 09 декабря 2010

Я использую класс в приложении 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();
11 голосов
/ 09 декабря 2010

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

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

0 голосов
/ 09 декабря 2010

Использовать System.Runtime.Serialization.Вы можете увидеть пример здесь: http://blog.kowalczyk.info/article/Serialization-in-C.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...