2011-12-06 115 views
0

我目前正在开发一个Android应用程序,该应用程序根据某个事件(如电池电量)自动更改电话状态。我有一个配置文件类,它有3个主要参数,名称,事件和状态(事件和状态是2个其他自定义类)为什么ObjectOutputStream.writeObject()抛出IOException?

在我的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(); 

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

另外,如果有更好的方法,我可以给我的ProfileList(ListActivity)和ProfileEdit类访问相同的ArrayList,那么请让我知道。

编辑:这里的IO异常堆栈跟踪:(该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

“IOException”的消息是什么? – jprofitt

+0

嗨jdprofit,我添加了堆栈跟踪到原来的问题,我希望它对你比对我更有用。谢谢。 –

回答

1

你的所有对象及其所有字段需要被序列 - 否则他们不能被序列化。 IO异常的另一个来源是缺少在SD卡上写入的权限。 (不只是你的应用程序需要有人在这个数据如果不是,它属于成provate区?)

序列化配置数据是方便,但可能是坏主意 - 如果你的对象签名的变化,数据将无法读取。更好的解决办法是马歇尔对象转换成JSON 并保存此文件(在无耻的自我广告:https://github.com/ko5tik/jsonserializer

+0

我的Profile类是Serializable,ArrayList也是,Profile类中的属性也需要是Serializable?我有权写入外部存储器,没有这个,它会抛出一个FileNotFound异常而不是IO。 关于将marshall对象转换为JSON,我看了一下代码,它是有道理的。要写我的ArrayList 我会用writer.beginArray();然后一个for循环write.value()所有的配置文件,然后writer.endArray()? –

+0

所有的字段都需要被序列化为。除非他们是暂时的。编组为JSON数组更容易,如果你拿我的数据绑定:JSONMarshaller。marshallArray(作家,arrayOfStuffYouLikeToMarshall);查看项目 –

+0

中的测试用例我看,看起来JSON是要走的路,那么我该如何去初始化JsonWriter? –

0

虽然康斯坦丁Pribluda确定了更好的解决方案为我需要做的,这个问题已经解决了。

原来我愚蠢地忽略了事实和状态类没有实现Serializable的事实。 Serializable类中的任何字段也必须是可序列化的,否则将抛出IO异常。

相关问题