Parcelable обнаружил IOException, записывая сериализуемый объект только в некоторых телефонах - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть это исключение в моем проекте во Fragment.java, и я не знаю, в чем проблема, потому что я уже реализовал Parcelable для класса MyClass и не должен быть проблемой с ним. Я что-то упустил?

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)

Вызывается java.io.NotSerializableException mypackage.model.MyClass

и вот код MyClass:

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

Я удалил основную часть методов, чтобы сделать ее более короткой для обзора. Я передаю этот объект с намерением между своими действиями, и мой код работает на многих телефонах, но это исключение возникает только в некоторых телефонах, а не на всех.

...