私はかなり奇妙な問題を抱えています。ロードしたデータの一部を、シリアル化されたオブジェクトとして保存したいと考えています。以前にこれを行ったことがありますが、何らかの理由で機能させることができません。
奇妙な部分は、オブジェクトの SERIALIZING で例外がスローされないことです。これにより、問題は Serializable オブジェクトにあるとは思えません。シリアル化されたオブジェクトの読み取り (読み込み) でのみ、例外がスローされます...
スタック トレースを見ると、最初の行は、シリアル化できないクラス OfflineDataHelpers を参照しています。私はそれを知っていますが、私はそれを望んでいません。クラス User だけであるべきなので、なぜそう言っているのかわかりません。
ユーザー クラス (シリアライズ可能なオブジェクト)
public class User implements Serializable{
private String username;
private String remember;
private String fullname;
private String email;
private int id;
private String session_id;
public User() {
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", fullname='" + fullname + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRemember() {
return remember;
}
public void setRemember(String remember) {
this.remember = remember;
}
public String getFullname() {
return fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSession_id() {
return session_id;
}
public void setSession_id(String session_id) {
this.session_id = session_id;
}
public boolean isNotNull(){
if (this.getId() >0 && this.getUsername().length()>1){
return true;
}
return false;
}
}
OfflineDataHelpers クラス ((逆) シリアル化を実行するクラス
public class OfflineDataHelpers{
private Context context;
private String USERFILENAME = "User.msl";
public OfflineDataHelpers(Context context) {
this.context = context;
}
public void saveUser(User user) {
try {
FileOutputStream fos = new FileOutputStream(getFileDir(USERFILENAME), true);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(user);
os.close();
System.out.println(user+" has been saved");
} catch (Exception e) {
e.printStackTrace();
}
}
public User loadUser() {
User user = new User();
try {
FileInputStream fis = new FileInputStream(getFileDir(USERFILENAME));
ObjectInputStream is = new ObjectInputStream(fis);
user = (User) is.readObject();
is.close();
System.out.println(user+ " is loaded");
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
public File getFileDir(String fileName) {
return new File(context.getExternalFilesDir(null), fileName);
}
}
関数 saveUser および loadUser は、有効な User オブジェクト (null 以外) を使用してアクティビティで呼び出されます。「loadUser」呼び出しを削除すると、例外はスローされず、「ユーザー .... が保存されました」と表示されます。
しかし、関数 loadUser を追加すると、スタックトレースに次のように表示されます。
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ java.io.WriteAbortedException: Read an exception; java.io.NotSerializableException: com.example.myapp.others.OfflineDataHelpers
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:779)
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ at com.example.myapp.others.OfflineDataHelpers.loadUser(OfflineDataHelpers.java:43)
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ at com.example.myapp.others.NetworkingController.LoginRequest(NetworkingController.java:50)
08-06 11:19:12.971 12097-12097/com.example.myapp W/System.err﹕ at com.example.myapp.fragments.InlogFragment.onActivityCreated(InlogFragment.java:77)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:958)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5017)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ Caused by: java.io.NotSerializableException: com.example.myapp.others.OfflineDataHelpers
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
08-06 11:19:12.981 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at com.example.myapp.others.OfflineDataHelpers.saveUser(OfflineDataHelpers.java:29)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at com.example.myapp.others.NetworkingController$AsyncLogin.doInBackground(NetworkingController.java:108)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at com.example.myapp.others.NetworkingController$AsyncLogin.doInBackground(NetworkingController.java:60)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-06 11:19:12.991 12097-12097/com.example.myapp W/System.err﹕ at java.lang.Thread.run(Thread.java:841)
これは、OfflineDataHelpers をシリアル化しようとしていることを示唆していますが、そうは思いません。誰でもアイデアはありますか?