我创建了一个由自定义对象组成的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
答案 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