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)

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.


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 ...


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 (...).


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


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

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

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.


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”


0

klasa Grade musi również implementować Serializable

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

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

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{
      } 
    }

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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.