IOException ditemui Parcelable menulis objek getar aktivitas serializable ()

171

jadi saya mendapatkan ini di logcat:

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

Saya tahu ini berarti bahwa kelas siswa saya tidak bersambung, tetapi ini adalah kelas siswa saya:

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

}

dan ini adalah kode yang menggunakan metode 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);

                        } 

                    });

tolong bantu saya mencari tahu apa yang salah dengan ini.

di sini adalah seluruh 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)
pengguna2896762
sumber
Gunakan LogCat untuk memeriksa seluruh jejak tumpukan Java yang terkait dengan pengecualian Anda. Jika Anda tidak memahami jejak tumpukan, rekatkan di sini. Juga, apa DSLLdan apa Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) dan Grade kelas lain yang dibuat oleh saya, keduanya juga serializable.
user2896762
Saya memposting jejak tumpukan
LogCar
4
Tidak terkait langsung, tetapi ... dalam kasus saya, saya mencoba membuat serialisasi kelas dalam yang didefinisikan di dalam kelas luar yang tidak dapat diserialisasi. Saya belajar bahwa kelas dalam non-statis berisi referensi ke kelas luar mereka (lihat pertanyaan ini ).
giraffe.guru

Jawaban:

324
Caused by: java.io.NotSerializableException: com.resources.student_list.DSLL$DNode

DSLLKelas Anda tampaknya memiliki DNodekelas dalam yang statis, dan DNodetidak Serializable.

CommonsWare
sumber
60
@ user2896762: Secara umum, di Android, mulai dari bagian bawah tumpukan jejak dan lanjutkan ke Caused bybaris terakhir . Itu biasanya akan menunjuk ke masalah spesifik. Semua bait jejak tumpukan lainnya mewakili pengecualian yang dibungkus di sekitar pengecualian "nyata" di bagian bawah jejak.
CommonsWare
3
Saya baru saja membaca yang disebabkan oleh, tidak tahu ini selama hampir 3 tahun berkembang.
Sterling Diaz
1
Terima kasih!!! @ user2896762 & @CommonsWare Saya membaca jejak Stack ... Ditemukan Salah satu objek di kelas saya adalah Tidak Di-serialisasi. dan Sekarang Ini berfungsi. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Cara menggunakan kode di atas. Bisakah Anda membantu saya?
Jiks
4
Setiap dan setiap kelas batin dalam Model harus bersambung.
Samir Mangroliya
55

Kelas OneThread Anda juga harus mengimplementasikan Serializable. Semua sub kelas dan sub kelas dalam harus mengimplementasikan Serializable .

ini bekerja untuk saya ...

Pankaj Talaviya
sumber
24

Jika Anda tidak dapat membuat DNode serializable, solusi yang baik adalah menambahkan "transient" ke variabel.

Contoh:

public static transient DNode dNode = null;

Ini akan mengabaikan variabel saat menggunakan Intent.putExtra (...).

Francisco Peters
sumber
2
Kata transientkunci dalam Java digunakan untuk menunjukkan bahwa suatu bidang tidak boleh diserialisasi. Jawaban lengkap di sini: stackoverflow.com/a/910522/1306012
Bruno Bieri
8

jika Anda POJO berisi model lain di dalamnya yang juga harus mengimplementasikan Serializable

Sai Gopi N
sumber
5

Bagi saya ini diselesaikan dengan membuat variabel dalam transient kelas.

Kode sebelumnya:

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

kode setelah

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Gomez NL
sumber
Ini tidak bisa bekerja untuk saya. Saya tidak dapat membuatnya sementara karena saya benar-benar membutuhkan nilai variabel itu di tempat lain dalam basis kode saya.
Taslim Oseni
Ini membantu saya. Terima kasih
viper
2

Masalahnya terjadi ketika kelas khusus Anda memiliki properti untuk beberapa kelas lain misalnya "Bitmap". Apa yang saya buat adalah mengubah bidang properti dari "foto Bitmap pribadi" menjadi "foto Bitmap sementara". Namun gambar kosong setelah saya mendapatkanIntent () dalam aktivitas penerima. Karena ini saya meneruskan kelas kustom ke maksud dan juga saya telah membuat array byte dari gambar dan meneruskannya secara terpisah ke maksud:

selectedItem adalah objek kustom saya dan getPlacePhoto adalah metodenya untuk mendapatkan gambar. Saya sudah mengaturnya sebelumnya dan sekarang saya mendapatkannya lebih dulu daripada mengubahnya dan membagikannya secara terpisah:

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

`

Kemudian dalam aktivitas penerima saya mendapatkan objek dan gambar sebagai array byte, mendekode gambar dan mengaturnya ke objek saya sebagai properti foto.

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

Pengecualian terjadi karena fakta bahwa salah satu kelas dalam atau kelas referensi lainnya tidak menerapkan implementasi serializable. Jadi pastikan bahwa semua kelas yang direferensikan harus mengimplementasikan implementasi serializable.

Sridhar Shanmugam
sumber
0

Saya juga fase kesalahan ini dan saya sedikit mengubah modelClass yang diimplementasikan antarmuka Serializable seperti:

Pada kelas Model itu juga mengimplementasikan antarmuka Parcelable dengan metode override writeToParcel ()

Kemudian baru saja mendapat kesalahan untuk "membuat pencipta" sehingga PENCIPTA adalah menulis dan juga membuat dengan modelclass contructor dengan argumen & tanpa argumen ..

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

Sini,

ArtistTrackClass -> ModelClass

Konstruktor dengan argumen Parcel "baca atribut kami" dan writeToParcel () adalah "tulis atribut kami"

Dhruv Raval
sumber
0

kelas Grade juga harus mengimplementasikan Serializable

public class Grade implements Serializable {
.....your content....
}
yoshi
sumber
0

Perlu mengubah semua arraylist ke wif Serializable di kelas bean:

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;
        }
    }
 }
murugan mani
sumber
0

Saya menghadapi masalah yang sama, masalahnya adalah ada beberapa kelas dalam dengan kata kunci statis. Setelah menghapus kata kunci statis itu mulai bekerja dan juga kelas batin harus mengimplementasikan ke Serializable

Skenario masalah

class A implements Serializable{ 
  class static B{
  } 
}

Diselesaikan oleh

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

Dalam kasus saya saya harus menerapkan MainActivitysebagai Serializablejuga. Karena saya perlu memulai layanan dari 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);
}
Tuan Brigante
sumber