web-dev-qa-db-ja.com

Parcelableでシリアライズ可能オブジェクトgetactivity()の書き込み中にIOExceptionが発生しました

だから私はlogcatでこれを得ています:

Java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)

これは私の学生クラスが直列化可能ではないことを意味しますが、それは、ここに私の学生クラスです:

import Java.io.Serializable;


public class Student implements Comparable<Student>,  Serializable{

    private static final long serialVersionUID = 1L;
    private String firstName, lastName;
    private DSLL<Grade> gradeList; 

    public Student() {
        firstName = "";
        lastName = "";
        gradeList = new DSLL<Grade>();
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public DSLL<Grade> getGradeList() {
        return gradeList;
    }

    public void setGradeList(DSLL<Grade> gradeList) {
        this.gradeList = gradeList;
    }

    public int compareTo(Student arg0) {
        return this.lastName.compareTo(arg0.getLastName());
    }

}

これがgetIntent()メソッドを使用しているコードです。

public void onItemClick(AdapterView<?> parent, View viewClicked, int pos,
                                long id) {

                            Student clickedStudent = studentList.get(pos);
                            int position = pos;
                            Intent intent = new Intent(getActivity().getApplicationContext(), ShowStudentActivity.class);
                            Log.e("CINTENT","CREATED!!!");
                            intent.putExtra("clickedStudent",clickedStudent);
                            intent.putExtra("newStudentList",newStudentList);
                            intent.putExtra("position",position);
                            Log.e("putExtra","Passed");
                            Log.e("Start activity","passed");
                            startActivity(intent);

                        } 

                    });

私がこれで間違っていることを理解するのを手伝ってください。

これが全体のLogCatです。

04-17 16:12:28.890: E/AndroidRuntime(22815): FATAL EXCEPTION: main
04-17 16:12:28.890: E/AndroidRuntime(22815): Java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Parcel.writeSerializable(Parcel.Java:1181)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Parcel.writeValue(Parcel.Java:1135)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Parcel.writeMapInternal(Parcel.Java:493)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Bundle.writeToParcel(Bundle.Java:1612)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Parcel.writeBundle(Parcel.Java:507)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.content.Intent.writeToParcel(Intent.Java:6111)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:1613)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1422)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.app.Activity.startActivityForResult(Activity.Java:3191)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.Java:848)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.support.v4.app.Fragment.startActivity(Fragment.Java:878)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at com.example.student_lists.MainActivity$DummySectionFragment$2.onItemClick(MainActivity.Java:477)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.widget.AdapterView.performItemClick(AdapterView.Java:292)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.widget.AbsListView.performItemClick(AbsListView.Java:1058)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:2514)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.widget.AbsListView$1.run(AbsListView.Java:3168)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Handler.handleCallback(Handler.Java:605)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Handler.dispatchMessage(Handler.Java:92)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Looper.loop(Looper.Java:137)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.app.ActivityThread.main(ActivityThread.Java:4447)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.lang.reflect.Method.invokeNative(Native Method)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.lang.reflect.Method.invoke(Method.Java:511)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at dalvik.system.NativeStart.main(Native Method)
04-17 16:12:28.890: E/AndroidRuntime(22815): Caused by: Java.io.NotSerializableException: com.resources.student_list.DSLL$DNode
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1364)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.Java:979)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.Java:368)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.Java:1074)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1404)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.Java:979)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.Java:368)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.Java:1074)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1404)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815):    at Android.os.Parcel.writeSerializable(Parcel.Java:1176)
135
user2896762
Caused by: Java.io.NotSerializableException: com.resources.student_list.DSLL$DNode

DSLLクラスはDNode静的内部クラスを持っているようですが、DNodeSerializableではありません。

258
CommonsWare

あなたのOneThreadクラスもSerializableを実装するべきです。すべてのサブクラスおよび内部サブクラス must Serializableを実装する.

これは私のために働いています...

36
Pankaj Talaviya

もしあなたがDNodeをシリアライズ可能にすることができないなら、良い解決策は変数に "transient"を追加することでしょう。

例:

public static transient DNode dNode = null;

Intent.putExtra(...)を使用するとき、これは変数を無視します。

23

もしあなたがPOJOの中にSerializableも実装すべき他のモデルが含まれているなら

3
saigopi

私にとっては、クラスを一時的に変更することでこれを解決しました。

前のコード:

public class UserLocation implements Serializable {
   public Location lastKnownLocation;
   public UserLocation() {}
}

後のコード

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
3
Gomez NL

あなたのカスタムクラスが他のクラスをプロパティとして持っているときに問題が発生します。 「ビットマップ」私が作ったのは、プロパティフィールドを "private Bitmap photo"から "private transient bitmap photo"に変更することです。ただし、レシーバアクティビティでgetIntent()を実行した後、画像は空になります。このため、カスタムクラスをインテントに渡し、さらに画像からバイト配列を作成して、それをインテントに別々に渡します。

selectedItemは私のカスタムオブジェクトで、getPlacePhotoは画像を取得するための彼のメソッドです。すでに設定していますが、変換して別々に渡すよりも先に取得するだけです。

 Bitmap image = selectedItem.getPlacePhoto();
 image.compress(Bitmap.CompressFormat.PNG, 100, stream);
 byte[] byteArray = stream.toByteArray();
 Intent intent = new Intent(YourPresentActivity.this, 
 TheReceiverActivity.class);
 intent.putExtra("selectedItem", selectedItem);                 
 intent.putExtra("image", byteArray);
 startActivity(intent);            

`

それからレシーバーアクティビティで、私は自分のオブジェクトと画像をバイト配列として取得し、画像をデコードしてそれを写真プロパティとして自分のオブジェクトに設定します。

 Intent intent = getIntent();
 selectedItem = (ListItem) intent.getSerializableExtra("selectedItem");
 byte[] byteArray = getIntent().getByteArrayExtra("image");
 Bitmap image = BitmapFactory.decodeByteArray(byteArray, 0, 
 byteArray.length);
 selectedItem.setPhoto(image);
2
Pavel Aslanov

私はまたこれらのエラーを段階的に見ています、そして私はmodelClassのちょっとした変更を実装していますSerializable interfaceのように:

そのModelクラスはParcelable interfacewithwriteToParcel()overrideメソッドも実装しています

それから、「create creator」にエラーが出たので、CREATORと書いて、modelclassコンストラクタで作成してください。引数あり、引数なし..

       @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(id);
            dest.writeString(name);
        }

        protected ArtistTrackClass(Parcel in) {
            id = in.readString();
            name = in.readString();
        }

       public ArtistTrackClass() {

        }

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

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

ここに、

ArtistTrackClass - > ModelClass

Parcel引数を持つコンストラクタは「属性を読む」、writeToParcel()は「属性を書く」

0
Dhruv Raval

私は同じ問題に直面しました、問題は静的キーワードを持ついくつかの内部クラスがあることでした。静的キーワードを削除した後、それは動作し始め、内部クラスはSerializableに実装する必要があります

発行シナリオ

class A implements Serializable{ 
  class static B{
  } 
}

解決者

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }
0
sunil KV

gradeクラスはSerializableも実装しなければなりません

public class Grade implements Serializable {
.....your content....
}
0
yOshi

私の場合、MainActivitySerializableとして実装する必要がありました。原因MainActivityからサービスを開始する必要がありました。

public class MainActivity extends AppCompatActivity implements Serializable {
    ...
    musicCover = new MusicCover(); // A Serializable Object
    ...
    sIntent = new Intent(MainActivity.this, MusicPlayerService.class);
    sIntent.setAction(MusicPlayerService.ACTION_INITIALIZE_COVER);
    sIntent.putExtra(MusicPlayerService.EXTRA_COVER, musicCover);
    startService(sIntent);
}
0
Mr Brigante

例外は、内部クラスまたは他の参照クラスのいずれもが直列化可能を実装していないという事実のために発生しました。そのため、参照可能なすべてのクラスを直列化可能に実装します。

0

Beanクラスですべての配列リストをSerializable wifに変更する必要があります

public static class PremiumListBean  implements Serializable {
    private List<AddOnValueBean> AddOnValue;

    public List<AddOnValueBean> getAddOnValue() {
        return AddOnValue;
     }

    public void setAddOnValue(List<AddOnValueBean> AddOnValue) {
        this.AddOnValue = AddOnValue;
    }


    public static class AddOnValueBean  implements Serializable{

        @SerializedName("Premium")
        private String Premium;

        public String getPremium() {
            return Premium;
        }

        public void setPremium(String Premium) {
            this.Premium = Premium;
        }
    }
 }
0
murugan mani