0

I have this exception in my project in Fragment.java and I don't know what is the problem, because I've already implement Parcelable for MyClass class and should not be a problem with it. Am I missing something?

Fatal Exception: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = mypackage.a.a.a)
   at android.os.Parcel.writeSerializable(Parcel.java:1447)
   at android.os.Parcel.writeValue(Parcel.java:1395)
   at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
   at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1337)
   at android.os.Bundle.writeToParcel(Bundle.java:1079)
   at android.os.Parcel.writeBundle(Parcel.java:690)
   at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:148)
   at android.os.Parcel.writeTypedArray(Parcel.java:1233)
   at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:564)
   at android.os.Parcel.writeParcelable(Parcel.java:1416)
   at android.os.Parcel.writeValue(Parcel.java:1322)
   at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
   at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1337)
   at android.os.Bundle.writeToParcel(Bundle.java:1079)
   at android.os.Parcel.writeBundle(Parcel.java:690)
   at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:150)
   at android.os.Parcel.writeTypedArray(Parcel.java:1233)
   at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:564)
   at android.os.Parcel.writeParcelable(Parcel.java:1416)
   at android.os.Parcel.writeValue(Parcel.java:1322)
   at android.os.Parcel.writeArrayMapInternal(Parcel.java:665)
   at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1337)
   at android.os.Bundle.writeToParcel(Bundle.java:1079)
   at android.os.Parcel.writeBundle(Parcel.java:690)
   at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3153)
   at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3455)
   at android.os.Handler.handleCallback(Handler.java:743)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:150)
   at android.app.ActivityThread.main(ActivityThread.java:5621)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

Caused by java.io.NotSerializableException mypackage.model.MyClass

and here is MyClass code:

public class MyClass implements Parcelable {

    private transient JSONObject json;
    public static final String KEY = "my_key";
    public static final String VALUE = "my_value";

    public MyClass(){
        json = new JSONObject();
    }

    public MyClass(String json){
        try {
            if (!TextUtils.isEmpty(json)) {
                json = new JSONObject(json);
            }else {
                json = new JSONObject();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public MyClass myMethod1(String s1, String s2){
        //Do something here
    }

    public String myMethod2(String s1){
        //Do something here
        return null;
    }

    @Override
    public String toString() {
        return json.toString();
    }

    public String jsonText() {
        return json.toString();
    }


    protected MyClass(Parcel in) {
        try {
            json = in.readByte() == 0x00 ? null : new JSONObject(in.readString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        if (json == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeString(json.toString());
        }
    }

    public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {
        @Override
        public MyClass createFromParcel(Parcel in) {
            return new MyClass(in);
        }

        @Override
        public MyClass[] newArray(int size) {
            return new MyClass[size];
        }
    };

    public static MyClass myMethod3(){
        //Do something here
    }
}

I have removed the body of methods for make it shorter to review. I'm passing this object with Intent between my activities and my code is working on many phones, but this exception only occurs in some phones, not all of them.

Reaz Murshed
  • 23,691
  • 13
  • 78
  • 98
Hamidreza Sahraei
  • 457
  • 1
  • 5
  • 13

0 Answers0