Parcelable napotkał IOException piszący serializowalny obiekt getactivity ()

171

więc otrzymuję to w logcat:

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

Wiem, że to oznacza, że ​​mojej klasy studenckiej nie można serializować, ale oto moja klasa studencka:

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

}

a to jest kod, który używa metody 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);

                        } 

                    });

proszę, pomóż mi dowiedzieć się, co jest w tym złego.

oto cały 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
źródło
Użyj LogCat do zbadania całego śladu stosu Java związanego z Twoim wyjątkiem. Jeśli nie rozumiesz śladu stosu, wklej go tutaj. Co jest DSLLi co jest Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) i Grade inna klasa stworzona przeze mnie, obie są również możliwe do serializacji.
user2896762
Opublikowałem ślad stosu
LogCar
4
Nie jest to bezpośrednio powiązane, ale ... w moim przypadku próbowałem serializować wewnętrzną klasę zdefiniowaną wewnątrz nieserializowalnej klasy zewnętrznej. Dowiedziałem się, że niestatyczne klasy wewnętrzne zawierają odniesienie do ich klasy zewnętrznej (zobacz to pytanie ).
giraffe.guru

Odpowiedzi:

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

Twoja DSLLklasa wydaje się mieć DNodestatyczną klasę wewnętrzną, a nią DNodenie jest Serializable.

CommonsWare
źródło
60
@ user2896762: Ogólnie rzecz biorąc, w systemie Android zacznij od dołu śladu stosu i przejdź do ostatniej Caused bylinii. Zwykle będzie to wskazywać na konkretny problem. Wszystkie pozostałe sekcje śledzenia stosu reprezentują zawinięte wyjątki wokół „rzeczywistego” wyjątku na dole śledzenia.
CommonsWare
3
Właśnie przeczytałem spowodowane przez, nie wiedziałem o tym przez prawie 3 lata.
Sterling Diaz
1
Dzięki!!! @ user2896762 & @CommonsWare Odczytałem ślad stosu ... Znaleziono Jeden z obiektów w mojej klasie nie został zserializowany. a teraz to działa. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Jak używać powyższego kodu. Czy możesz mi pomóc, proszę?
Jiks,
4
Każda klasa wewnętrzna w Model musi być serializowana.
Samir Mangroliya
55

Twoja klasa OneThread powinna również implementować Serializable. Wszystkie podklasy i wewnętrzne podklasy muszą implementować Serializable .

to działa dla mnie ...

Pankaj Talaviya
źródło
24

Jeśli nie możesz umożliwić serializacji DNode, dobrym rozwiązaniem byłoby dodanie „przejściowej” do zmiennej.

Przykład:

public static transient DNode dNode = null;

Spowoduje to zignorowanie zmiennej podczas korzystania z Intent.putExtra (...).

Francisco Peters
źródło
2
Słowo transientkluczowe w Javie służy do wskazania, że ​​pole nie powinno być serializowane. Pełna odpowiedź tutaj: stackoverflow.com/a/910522/1306012
Bruno Bieri
8

jeśli POJO zawiera jakikolwiek inny model wewnątrz, który powinien również implementować Serializable

Sai Gopi N.
źródło
5

Dla mnie zostało to rozwiązane przez uczynienie zmiennej w klasie przejściową.

Kod przed:

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

kod po

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Gomez NL
źródło
To nie zadziała dla mnie. Nie mogę uczynić tego przejściowym, ponieważ faktycznie potrzebuję wartości tej zmiennej w innym miejscu w mojej bazie kodu.
Taslim Oseni
To mi pomogło. Dzięki
żmija
2

Problem występuje, gdy klasa niestandardowa ma właściwość inną klasę, np. „Bitmap”. Zmieniłem pole właściwości z „prywatnego zdjęcia bitmapowego” na „prywatne przejściowe zdjęcie bitmapy”. Jednak obraz jest pusty po wykonaniu funkcji getIntent () w działaniu odbiornika. Z tego powodu przekazałem klasę niestandardową do intencji, a także utworzyłem tablicę bajtów z obrazu i przekazałem ją oddzielnie do intencji:

selectedItem to mój niestandardowy obiekt, a getPlacePhoto to jego metoda na uzyskanie obrazu. Już to ustawiłem, a teraz po prostu go najpierw otrzymuję, niż konwertuję i przekazuję osobno:

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

`

Następnie w aktywności odbiornika otrzymuję obiekt i obraz jako tablicę bajtów, dekoduję obraz i ustawiam go na mój obiekt jako właściwość 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
źródło
2

Wyjątek wystąpił z powodu faktu, że żadna z klas wewnętrznych lub innych klas, do których się odwołuje, nie zaimplementowała implementacji możliwej do serializacji. Dlatego upewnij się, że wszystkie klasy, do których się odwołujesz, muszą implementować implementację możliwą do serializacji.

Sridhar Shanmugam
źródło
0

Jestem również fazą tych błędów i jestem trochę zmiany w modelClass, które są zaimplementowane Serializowalny interfejs, taki jak:

W tej klasie Model zaimplementuj również interfejs Parcelable z metodą override writeToParcel ()

Wtedy właśnie pojawił się błąd „utwórz twórcę”, więc TWÓRCA pisze, a także tworzy z konstruktorem klasy modelowej z argumentami i bez argumentów .

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

Tutaj,

ArtistTrackClass -> ModelClass

Konstruktor z argumentami Parcel „przeczytaj nasze atrybuty” i writeToParcel () to „zapisz nasze atrybuty”

Dhruv Raval
źródło
0

klasa Grade musi również implementować Serializable

public class Grade implements Serializable {
.....your content....
}
yOshi
źródło
0

Musisz zmienić wszystkie arraylist na serializowalny wif w klasie 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
źródło
0

Napotkałem ten sam problem, problem polegał na tym, że istnieje kilka klas wewnętrznych ze słowem kluczowym static.Po usunięciu słowa kluczowego static zaczęło działać, a także klasa wewnętrzna powinna być implementowana do Serializable

Scenariusz problemu

class A implements Serializable{ 
  class static B{
  } 
}

Rozwiązany przez

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }
sunil KV
źródło
0

W moim przypadku miałem do wdrożenia MainActivityjako Serializablezbyt. Ponieważ musiałem uruchomić usługę z mojego 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);
}
Panie Brigante
źródło