我知道可能有很多这样的事情发生(并且相信我在试图做到这一点时经历了很多)但我似乎无法实现这一目标。 我试图将自定义对象(汽车)列表保存到本地存储上的文件中,然后通过单击按钮将其加载回来。 我一直在尝试使用基于我读过的许多来源的FileOutputStream。由于某种原因,当使用简单的字符串列表进行测试时,这种方法运行良好但是当涉及到我的自制对象时,我在尝试保存时不断获得IO异常。如果有人可以看看我的代码并告诉我我错过了什么(花了20多个小时试图自己排序这个没有运气)。 P.S - 按钮调用保存和加载方法,这些方法工作正常,因此忽略了代码。
public class Main extends Activity implements OnClickListener{
public static List<Car> carList = new ArrayList<Car>();
String FILENAME = "carListFile";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonView_saveb;
Button buttonView_loadb;
buttonView_saveb = (Button)findViewById(R.id.saveb);
buttonView_loadb = (Button)findViewById(R.id.loadb);
buttonView_saveb.setOnClickListener(this);
buttonView_loadb.setOnClickListener(this);
@Override
public void onClick(View view){
switch (view.getId()){
case R.id.saveb:
SaveData();
break;
case R.id.loadb:
LoadData();
break;
}
}
public void LoadData(){
ArrayList<car> toReturn;
FileInputStream fis;
try {
fis = openFileInput(FILENAME);
ObjectInputStream oi = new ObjectInputStream(fis);
toReturn = (ArrayList<Car>) oi.readObject();
oi.close();
} catch (FileNotFoundException e) {
System.out.println("Failed to load, file '"+FILENAME+"' not found");
} catch (ClassNotFoundException e) {
System.out.println("Failed to load from file '"+FILENAME+"', Class not found");
} catch (IOException e) {
System.out.println("Failed to load from file '"+FILENAME+"', I/O Exception")
}
}
// this method return io exception, no idea why
public void SaveData(){
try {
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream of = new ObjectOutputStream(fos);
of.writeObject(diveLog);
of.flush();
of.close();
} catch (FileNotFoundException e) {
System.out.println("Failed to save, file '"+FILENAME+"' not found");
} catch (IOException e) {
System.out.println("Failed to save to file '"+FILENAME+"', I/O Exception");
}
}
}
无论我做什么,这一直让我得到IO异常。 还要注意我有一个按钮,它将汽车添加到列表中,所以我不会保存一个空列表(虽然我不明白为什么这应该重要)。
答案 0 :(得分:1)
感谢所有花时间帮助我的人。 在添加以下行之后似乎:
e.printStackTrace();
到异常捕获器并跟随logCat输出我发现Car无法序列化。一项快速研究表明,由于Car对象来自一个类(Car.java),该类必须实现'serializable'才能被序列化,然后再进行反序列化。
所以在Car.java文件中:
public class Car implements Serializable {
我在整个过程中遇到了一个很好的解释,非常适合像我这样的新手: https://www.youtube.com/watch?v=6MisF1sxBTo