Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Parcelable仅在某些手机中写入可序列化对象时遇到IOException_Java_Android_Crash_Parcelable - Fatal编程技术网

Java Parcelable仅在某些手机中写入可序列化对象时遇到IOException

Java Parcelable仅在某些手机中写入可序列化对象时遇到IOException,java,android,crash,parcelable,Java,Android,Crash,Parcelable,我在Fragment.java中的项目中遇到了这个异常,我不知道问题出在哪里,因为我已经为MyClass实现了Parcelable,应该不会有问题。 我错过什么了吗 Fatal Exception: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = mypackage.a.a.a) at android.os.Parcel.writeSeria

我在Fragment.java中的项目中遇到了这个异常,我不知道问题出在哪里,因为我已经为MyClass实现了Parcelable,应该不会有问题。 我错过什么了吗

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
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
    }
}
公共类MyClass实现了可包裹{
私有瞬态JSONObject json;
公共静态最终字符串KEY=“my_KEY”;
公共静态最终字符串值=“我的值”;
公共MyClass(){
json=新的JSONObject();
}
公共MyClass(字符串json){
试一试{
如果(!TextUtils.isEmpty(json)){
json=新的JSONObject(json);
}否则{
json=新的JSONObject();
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
公共MyClass myMethod1(字符串s1、字符串s2){
//在这里做点什么
}
公共字符串myMethod2(字符串s1){
//在这里做点什么
返回null;
}
@凌驾
公共字符串toString(){
返回json.toString();
}
公共字符串jsonText(){
返回json.toString();
}
受保护的MyClass(包裹中){
试一试{
json=in.readByte()==0x00?null:新的JSONObject(in.readString());
}捕获(JSONException e){
e、 printStackTrace();
}
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
if(json==null){
目标写入字节((字节)(0x00));
}否则{
目标写入字节((字节)(0x01));
dest.writeString(json.toString());
}
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共MyClass createFromParcel(地块中){
返回新的MyClass(在中);
}
@凌驾
公共MyClass[]新数组(整数大小){
返回新的MyClass[大小];
}
};
公共静态MyClass myMethod3(){
//在这里做点什么
}
}

我已经删除了一系列的方法,使其更简短。我有意在我的活动之间传递这个对象,我的代码在很多手机上都可以使用,但是这个异常只发生在一些手机上,而不是所有手机上。

从表面上看,问题是你的类没有实现
Serializable
@StephenC我应该同时实现Serializable和Parcelable吗?我猜是的。试试看。@StephenC那么intent.putExtra()会有歧义,它不知道使用Serializable或Parcelable。然后可能会将它指向
(Parcelable)yourObject