2011-12-06 4 views
0

私は現在、バッテリー残量などの特定のイベントに基づいて電話の状態を自動的に変更するAndroidアプリを開発中です。私は3つの主要なパラメータ、名前、イベントと状態(イベントと状態は2つの他のカスタムクラスです)を持っているProfileクラスを持っていますなぜObjectOutputStream.writeObject()はIOExceptionをスローしますか?

私のProfileEditクラスでは、EditTextやSpinnerなどの様々なコンポーネントがあります。 。各プロファイルを表示するListActivityクラスのArrayListと、現在のArrayListを取得して新しいプロファイルを追加する、または更新するProfileEditクラスへのアクセスが必要です。

私が最初にやったのは、ObjectOutputStreamを使ってArrayListを電話機のSDカードに書き込んだ後、それを必要とするクラスで取り出すことでした。しかしこれまでの私の試みは、IOExceptionをスローすることに終わりました。私のコードは次のとおりです。

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

プロファイルオブジェクトはファイルに書き込まれるmyListです。なぜこれが例外をスローしているのかわかりません。 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例外のもう1つの原因は、SDカードに書き込む権限がないことです。 (あなたのアプリケーションがこのデータを必要とする人以外は誰ですか?そうでなければ、それは証明エリアに属します)

設定データをシリアライズするのは便利ですが、オブジェクトシグネチャが変更された場合はデータを読むことができません。マーシャルは、JSON にオブジェクトと、このファイル(上の恥知らずな自己宣伝:https://github.com/ko5tik/jsonserializer)を保存するためのより良い解決策は以下のようになり

+0

My ProfileクラスはSerializableで、ArrayListもあります。Profileクラス内の属性もSerializableでなければなりませんか?私は外部ストレージに書き込む許可を持っていますが、IOではなくFileNotFound例外がスローされました。 JSONへのマーシャルオブジェクトに関して、私はコードを見ていて、それは一種の意味がありました。 ArrayList を書き込むにはwriter.beginArray()を使用します。すべてのプロファイルをwrite.value()するためのforループ、次にwriter.endArray()? –

+0

すべてのフィールドは、にシリアライズ可能である必要があります。彼らが一時的に混乱していない限り。 JSON Arrayへのマーシャリングは、JSONMarshallerというデータバインディングを使用するとさらに簡単になります。marshallArray(writer、arrayOfStuffYouLikeToMarshall);プロジェクトのテストケースを参照してください –

+0

JSONのように見えますが、JsonWriterを初期化するにはどうしたらいいですか? –

0

コンスタンチンPribludaは私が行うために必要なもののためのよりよい解決策を識別しますが、この質問は解決されています。

私は、私のイベントクラスとステートクラスがSerializableを実装していないという事実を見落としました。 Serializableクラス内のフィールドもすべてSerializableでなければなりません。それ以外の場合はIO例外がスローされます。