如何存储自定义对象的arraylist?

时间:2010-12-09 00:55:43

标签: android sqlite

我创建了一个由自定义对象组成的arraylist。基本上用户将创建一个类,每次创建一个类时,都会在arraylist中添加一个新的Lecture(我的自定义对象)。我需要保存生成的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 个答案:

答案 0 :(得分:13)

我在我正在开发的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来保存列表的'size'。

当我回读时,我这样做......

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

答案 1 :(得分:11)

你很幸运,你所有的班级成员都已经可以串行了,所以你的第一步就是说讲座是可序列化的。

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

回读数据与写入非常对称,所以我把它留给了这个答案。此外,序列化对象仍然有很多警告,所以我建议你做一些谷歌搜索,并阅读一般的Java序列化。

答案 2 :(得分:0)

使用System.Runtime.Serialization。 你可以在这里看到一个例子: http://blog.kowalczyk.info/article/Serialization-in-C.html