为什么ObjectOutputStream.writeObject()抛出IOException?

时间:2011-12-06 03:26:20

标签: android arraylist ioexception objectoutputstream

我目前正在开发一款Android应用,可根据特定事件自动更改手机状态,例如电池电量。我有一个Profile类,它有3个主要参数,名称,事件和状态(事件和状态是2个其他自定义类)

在我的ProfileEdit类中,有各种组件,如EditText和Spinner,供用户配置Profile。我需要在ListActivity类中访问一个类型为Profile的ArrayList,它显示每个配置文件,以及我的ProfileEdit类,它获取当前的ArrayList并添加新的配置文件,或者更新一个。

我首先要做的就是使用ObjectOutputStream将我的ArrayList写入手机SD卡,然后任何需要它的类都可以检索它。但是到目前为止我尝试这样做只会导致抛出IOException。我的代码如下:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/sdcard/profile.prof"));
oos.writeObject(profiles);
oos.flush();
oos.close();

profiles对象是我要写入文件的ArrayList。我无法弄清楚为什么这会抛出异常。我尝试通过调用writeObject(“Hello”)将对象更改为字符串;并且不再抛出异常,所以我只能假设它与ArrayList有关。我的印象是ArrayList类实现了serializable,我的Profile类也实现了serializable,尽管它没有做同样的事情。

或者,如果有更好的方法可以让我的ProfileList(ListActivity)和ProfileEdit类访问同一个ArrayList,那么请告诉我。

编辑:这是IO Exceptions堆栈跟踪:( ProfileEdit类的第114行是writeObject()行)

EZSettings(14788): IO Exception
EZSettings(14788): java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
EZSettings(14788): java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
EZSettings(14788): java.util.ArrayList.writeObject(ArrayList.java:651)
EZSettings(14788): java.lang.reflect.Method.invokeNative(Native Method)
EZSettings(14788): java.lang.reflect.Method.invoke(Method.java:507)
EZSettings(14788): java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1219)
EZSettings(14788): java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
EZSettings(14788): java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
EZSettings(14788): java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
EZSettings(14788): com.ezstatechanger.ProfileEdit.saveState(ProfileEdit.java:114)
EZSettings(14788): com.ezstatechanger.ProfileEdit.access$0(ProfileEdit.java:80)
EZSettings(14788): com.ezstatechanger.ProfileEdit$1.onClick(ProfileEdit.java:72)
EZSettings(14788): android.view.View.performClick(View.java:2538)
EZSettings(14788): android.view.View$PerformClick.run(View.java:9152)
EZSettings(14788): android.os.Handler.handleCallback(Handler.java:587)
EZSettings(14788): android.os.Handler.dispatchMessage(Handler.java:92)
EZSettings(14788): android.os.Looper.loop(Looper.java:123)
EZSettings(14788): android.app.ActivityThread.main(ActivityThread.java:3691)
EZSettings(14788): java.lang.reflect.Method.invokeNative(Native Method)
EZSettings(14788): java.lang.reflect.Method.invoke(Method.java:507)
EZSettings(14788): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
EZSettings(14788): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
EZSettings(14788): dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

所有对象及其所有字段都需要可序列化 - 否则无法序列化。 IO异常的另一个原因是缺乏在SD卡上写入的权限。 (除了你的应用程序之外,有人需要这些数据吗?如果没有,它属于provate区域。)

序列化配置数据很方便,但可能不太好 - 如果对象签名发生变化,数据将无法读取。更好的解决方案是将对象编组为JSON 并保存此文件(无耻的自我广告:https://github.com/ko5tik/jsonserializer

答案 1 :(得分:0)

虽然Konstantin Pribluda为我需要做的事情找到了更好的解决方案,但这个问题已经解决了。

原来我愚蠢地忽略了我的Event和State类没有实现Serializable的事实。 Serializable类中的任何字段也必须是Serializable,否则抛出IO Exception。