Parcelable обнаружил IOException, записывая сериализуемый объект getactivity ()

171

поэтому я получаю это в 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)
user2896762
источник
Используйте LogCat для проверки всей трассировки стека Java, связанной с вашим исключением. Если вы не понимаете трассировку стека, вставьте ее сюда. Кроме того, что есть DSLLи что есть Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) и Grade другой класс, созданный мной, оба они также сериализуемы.
user2896762
Я разместил трассировку стека LogCar
user2896762
4
Не связано напрямую, но ... в моем случае я пытался сериализовать внутренний класс, определенный внутри несериализуемого внешнего класса. Я узнал, что нестатические внутренние классы содержат ссылку на их внешний класс (см. Этот вопрос ).
giraffe.guru

Ответы:

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

Ваш DSLLкласс имеет DNodeстатический внутренний класс, и DNodeего нет Serializable.

CommonsWare
источник
60
@ user2896762: Как правило, на Android начинайте с нижней части трассировки стека и продвигайтесь до последней Caused byстроки. Обычно это указывает на конкретную проблему. Все остальные разделы трассировки стека представляют обернутые исключения вокруг «реального» исключения в нижней части трассы.
CommonsWare
3
Я только что прочитал вызванную, не знал это в течение почти 3 лет разработки.
Стерлинг Диаз
1
Спасибо!!! @ user2896762 & @CommonsWare Я прочитал трассировку стека ... Найден Один из объектов в моем классе не был сериализован. и сейчас работает. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Как использовать приведенный выше код. Можете ли вы помочь мне, пожалуйста?
Джикс
4
Каждый внутренний класс в Model должен быть сериализован.
Самир Мангролия
55

Ваш класс OneThread также должен реализовывать Serializable. Все подклассы и внутренние подклассы должны реализовывать Serializable .

это работает для меня ...

Панкадж Талавия
источник
24

Если вы не можете сделать DNode сериализуемым, хорошим решением было бы добавить «переменную» к переменной.

Пример:

public static transient DNode dNode = null;

Это будет игнорировать переменную при использовании Intent.putExtra (...).

Франсиско Питерс
источник
2
transientКлючевое слово в Java используется для указания того, что поле не должно быть сериализации. Полный ответ здесь: stackoverflow.com/a/910522/1306012
Бруно Биери
8

если вы POJO содержит любую другую модель внутри, которая также должна реализовывать Serializable

Саи Гопи Н
источник
5

Для меня это было решено, сделав переменную внутри класса переходной.

Код перед:

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

код после

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Гомес Н.Л.
источник
Это не может работать для меня. Я не могу сделать его временным, потому что мне действительно нужно значение этой переменной где-то еще в моей кодовой базе.
Таслим Осени
Это помогло мне. Спасибо
гадюка
2

Проблема возникает, когда ваш пользовательский класс имеет для свойства некоторый другой класс, например «Bitmap». Что я сделал, так это изменил поле свойства с «частное растровое фото» на «частное временное растровое фото». Однако изображение пусто после того, как я 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

Исключение произошло из-за того, что ни один из внутренних классов или других ссылочных классов не реализовал сериализуемую реализацию. Поэтому убедитесь, что все ссылочные классы должны реализовывать сериализуемую реализацию.

Шридхар Шанмугам
источник
0

Я также фаза эти ошибки, и я немного изменить в ModelClass, которые реализованы интерфейс Serializable, как:

В этом классе Model также реализован интерфейс Parcelable с методом переопределения writeToParcel ()

Тогда только что получил ошибку «создать создателя», поэтому CREATOR пишет, а также создает с помощью конструктора класса модели с аргументами и без аргументов .

       @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 "read our attribute" и writeToParcel () - это "write our attribute"

Дхрув Равал
источник
0

класс Grade также должен реализовывать Serializable

public class Grade implements Serializable {
.....your content....
}
Йоши
источник
0

Нужно изменить весь массив ArrayList на 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

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

Сценарий выпуска

class A implements Serializable{ 
  class static B{
  } 
}

Разрешено

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }
Сунил КВ
источник
0

В моем случае мне пришлось реализовать MainActivityтак Serializableже. Потому что мне нужно было запустить службу из моего 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);
}
Мистер Бриганте
источник