2011-12-06 2 views
0

현재 배터리 잔량과 같은 특정 이벤트를 기반으로 휴대 전화 상태를 자동으로 변경하는 Android 앱을 개발 중입니다. 나는 3 가지 주요 매개 변수, 이름, 이벤트 및 상태 (이벤트 및 상태 2 다른 사용자 지정 클래스)ObjectOutputStream.writeObject()가 IOException을 던지는 이유는 무엇입니까?

있다 내 ProfileEdit 클래스에서 EditText 및 Spinner 사용자가 프로필을 구성하는 등의 다양한 구성 요소가 있습니다 . 각 프로필을 표시하는 ListActivity 클래스에있는 Profile 유형의 ArrayList에 액세스해야하며 현재 ArrayList를 가져 와서 새 프로필을 추가하거나 업데이트하는 ProfileEdit 클래스에 액세스해야합니다.

먼저 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 클래스가 serializable을 구현하고, Profile 클래스도 serializable을 구현한다는 인상을 받았다.

다른 방법으로 내 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 카드에 쓸 수있는 권한이 없다는 것입니다. (응용 프로그램을 제외하고 누군가이 데이터를 필요로합니까? 그렇지 않다면 증명 된 영역에 속합니다.)

구성 데이터 직렬화는 편리하지만 바람직하지 않을 수 있습니다. 객체 서명이 변경되면 데이터를 읽을 수 없습니다. 더 나은 해결책은 객체를 JSON 으로 정렬하고이 파일을 저장하는 것입니다. (Shameless self advertising : https://github.com/ko5tik/jsonserializer)

+0

내 프로필 클래스가 Serializable이고 ArrayList도 있습니다. 프로필 클래스 내의 특성도 Serializable이어야합니까? 외부 저장소에 쓸 수있는 권한이 있습니다. IO가 아닌 FileNotFound 예외가 발생했습니다. JSON으로 마샬링 객체에 관해서, 나는 코드를 살펴 보았고 이해가된다. 내 ArrayList 을 작성하려면 writer.beginArray()를 사용합니다. 그런 다음 for 루프를 사용하여 모든 프로파일을 write.value() 한 다음 writer.endArray()를 호출합니다. –

+0

모든 필드를에 serialize 할 수 있어야합니다. 그들이 일시적으로 합병되지 않는 한. JSON Array에 마샬링하면 JSONMarshaller 내 데이터 바인딩을 사용하면 훨씬 쉽습니다.marshallArray (writer, arrayOfStuffYouLikeToMarshall); –

+0

프로젝트의 테스트 케이스를 봅니다. JSON이 그때 갈 길인 것처럼 보입니다. JsonWriter를 초기화하는 방법은 무엇입니까? –

0

콘스탄틴 프리 리 루다는 내가해야 할 일에 대해 더 나은 해결책을 찾았지만이 문제는 해결되었습니다.

나는 Event와 State 클래스가 Serializable을 구현하지 않았다는 사실을 간과했다. Serializable 클래스 내의 모든 필드도 Serializable이어야합니다. 그렇지 않으면 IO Exception이 throw됩니다.

관련 문제