1

I have a pretty weird problem. Some data I loaded I want to save as an serialized object. I have done this before but for some reason I just can't get it to work.

The weird part is, that NO exceptions are thrown in the SERIALIZING of the object, which makes me think that the problem is not with the Serializable object. Only in reading (loading) in the serialized object the exception is thrown...

When you look to the stacktrace, the first line refers to the class OfflineDataHelpers that it is not serializable. I know that, but I do not even want it to be. Only the class User should be, so I don't get why it says that.

User class (the serializable object)

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;
 }
}

The OfflineDataHelpers class (class that performs the (de)serialization

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);
 }
}

The functions saveUser and loadUser are called in an activity with a valid User object (not null) . If I remove the "loadUser" call, no exception is thrown, it just says: "user .... is saved "

But when I add the function loadUser, the following appears in the stacktrace:

  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)

Which suggests that I try to serialize OfflineDataHelpers, but I don't think I do. Anyone an idea?

user207421
  • 305,947
  • 44
  • 307
  • 483
Jasper
  • 2,389
  • 4
  • 25
  • 40
  • The exception occurs when deserializing on `OfflineDataHelpers` class, it implements Serializable? – Wundwin Born Aug 06 '14 at 09:25
  • It does not as you can see in the code, but I don't think it should either, since I do not to try to serialize it. And context, a parameter of OfflineDataHelpers is not Serializable so neither can its superclass – Jasper Aug 06 '14 at 09:28
  • Can you try `FOS` and `FIS` invoking from `Context` like this link http://stackoverflow.com/questions/4118751/how-do-i-serialize-an-object-and-save-it-to-a-file-in-android – Wundwin Born Aug 06 '14 at 09:39
  • I'll try, but where is the file saved in that case? in my way i know it is saved in the right folder... – Jasper Aug 06 '14 at 09:48
  • Did you solved your problem in the meantime? Is it possible `OfflineDataHelpers` had any connection to `User` class in previous version of your code? – Piro Sep 12 '19 at 07:53

0 Answers0