Розділення, що зустрічається з IOException, записує серіалізаційну гетактивність об'єкта ()


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)

Використовуйте LogCat для вивчення всього сліду стека Java, пов'язаного з вашим винятком. Якщо ви не розумієте сліду стека, вставте його сюди. Також, що таке DSLLі що таке Grade?
CommonsWare

DSLL (DoubleSortedLinckedList) та ще один клас, створений мною, вони також серіалізуються.
користувач2896762

Я опублікував слід стека
LogCar

4
Не пов'язане безпосередньо, але ... в моєму випадку я намагався серіалізувати внутрішній клас, визначений всередині несериалізуючого зовнішнього класу. Я дізнався, що нестатичні внутрішні класи містять посилання на їх зовнішній клас (див. Це питання ).
giraffe.guru

Відповіді:


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

DSLLСхоже, у вашого класу є DNodeстатичний внутрішній клас, а DNodeні Serializable.


60
@ user2896762: Взагалі в Android, починайте з нижньої частини стеження стека і працюйте до останнього Caused byрядка. Зазвичай це вказує на конкретну проблему. Усі інші строфи сліду стека представляють собою обернені винятки навколо "реального" винятку в нижній частині сліду.
CommonsWare

3
Я щойно прочитав викликане, не знав цього майже три роки, розвиваючись.
Стерлінг Діаз

1
Дякую!!! @ user2896762 & @CommonsWare Я читав слід стека ... Знайдено Один із об’єктів у моєму класі не був серіалізований. і зараз це працює. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya

@CommonsWare Як користуватися вищевказаним кодом. Чи можете ви допомогти мені pls?
Джикс

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

Для мене це було вирішено, зробивши змінну withing класу тимчасовим.

Код до:

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

код після

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

Це не може працювати для мене. Я не можу зробити його тимчасовим, оскільки мені фактично потрібне значення цієї змінної десь в моїй базі коду.
Таслім Осені

Це мені допомогло. Спасибі
гадюка

2

Проблема виникає, коли у вашому користувальницькому класі є властивість якогось іншого класу, наприклад, "Bitmap". Що я зробив - це змінити властивість поля з "приватного фото Bitmap" на "приватне перехідне фото Bitmap". Однак зображення порожнє після того, як я отримаюIntent () у активності приймача. Через це я передав спеціальний клас до наміру, а також створив байтовий масив із зображення і передаю його окремо до наміру:

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, як:

У цей клас також реалізувати модель 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 "читаємо наші атрибути", а writeToParcel () - " записуємо наші атрибути"


0

клас класу також повинен реалізовувати Serializable

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

0

Потрібно змінити весь arraylist на Serializable wif у класі 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;
        }
    }
 }

0

Я зіткнувся з тією ж проблемою. Проблеми полягали в тому, що існують деякі внутрішні класи зі статичним ключовим словом.

Випуск сценарію

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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.