Parcelable hat eine IOException gefunden, die serialisierbare Objekt-Getaktivität () schreibt

171

Also bekomme ich das in Logcat:

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

Ich weiß, dass dies bedeutet, dass meine Schülerklasse nicht serialisierbar ist, aber hier ist meine Schülerklasse:

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

}

und dies ist der Code, der die Methode getIntent () verwendet:

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

                        } 

                    });

Bitte helfen Sie mir herauszufinden, was daran falsch ist.

Hier ist das ganze 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
quelle
Verwenden Sie LogCat, um den gesamten Java-Stack-Trace zu untersuchen, der Ihrer Ausnahme zugeordnet ist. Wenn Sie die Stapelverfolgung nicht verstehen, fügen Sie sie hier ein. Auch was ist DSLLund was ist Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) und Grade einer anderen von mir erstellten Klasse sind beide auch serialisierbar.
user2896762
Ich habe den LogCar-Stack-Trace gepostet
user2896762,
4
Nicht direkt verwandt, aber ... in meinem Fall habe ich versucht, eine innere Klasse zu serialisieren, die in einer nicht serialisierbaren äußeren Klasse definiert ist. Ich habe gelernt, dass nicht statische innere Klassen einen Verweis auf ihre äußere Klasse enthalten (siehe diese Frage ).
Giraffe.guru

Antworten:

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

Ihre DSLLKlasse scheint eine DNodestatische innere Klasse zu haben und DNodeist es nicht Serializable.

CommonsWare
quelle
59
@ user2896762: Beginnen Sie unter Android im Allgemeinen am unteren Rand der Stapelverfolgung und arbeiten Sie sich bis zur letzten Caused byZeile vor. Das wird normalerweise auf das spezifische Problem hinweisen. Alle anderen Zeilengruppen der Stapelverfolgung stellen umschlossene Ausnahmen um die "echte" Ausnahme am unteren Rand der Ablaufverfolgung dar.
CommonsWare
3
Ich hatte gerade die Ursache von gelesen, wusste das seit fast 3 Jahren nicht mehr.
Sterling Diaz
1
Vielen Dank!!! @ user2896762 & @CommonsWare Ich habe den Stack-Trace gelesen ... Gefunden Eines der Objekte in meiner Klasse war nicht serialisiert. und jetzt funktioniert es. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Verwendung des obigen Codes. Kannst du mir bitte helfen?
Jiks
4
Jede innere Klasse in Model muss serialisiert werden.
Samir Mangroliya
55

Ihre OneThread-Klasse sollte auch Serializable implementieren. Alle Unterklassen und inneren Unterklassen müssen Serializable implementieren .

das ist für mich gearbeitet ...

Pankaj Talaviya
quelle
24

Wenn Sie DNode nicht serialisierbar machen können, besteht eine gute Lösung darin, der Variablen "transient" hinzuzufügen.

Beispiel:

public static transient DNode dNode = null;

Dies ignoriert die Variable bei Verwendung von Intent.putExtra (...).

Francisco Peters
quelle
2
Das transientSchlüsselwort in Java gibt an, dass ein Feld nicht serialisiert werden soll. Vollständige Antwort hier: stackoverflow.com/a/910522/1306012
Bruno Bieri
8

Wenn Ihr POJO ein anderes Modell enthält, sollte auch Serializable implementiert werden

Sai Gopi N.
quelle
5

Für mich wurde dies gelöst, indem die Variable innerhalb der Klasse vorübergehend gemacht wurde.

Code vor:

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

Code nach

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Gomez NL
quelle
Das kann bei mir nicht funktionieren. Ich kann es nicht vorübergehend machen, da ich den Wert dieser Variablen tatsächlich an einer anderen Stelle in meiner Codebasis benötige.
Taslim Oseni
Das hat mir geholfen. Danke
Viper
2

Das Problem tritt auf, wenn Ihre benutzerdefinierte Klasse für die Eigenschaft eine andere Klasse hat, z. B. "Bitmap". Ich habe das Eigenschaftsfeld von "privates Bitmap-Foto" in "privates vorübergehendes Bitmap-Foto" geändert. Das Bild ist jedoch leer, nachdem ich in der EmpfängeraktivitätIntent () erhalten habe. Aus diesem Grund habe ich die benutzerdefinierte Klasse an die Absicht übergeben und außerdem ein Byte-Array aus dem Bild erstellt und separat an die Absicht übergeben:

selectedItem ist mein benutzerdefiniertes Objekt und getPlacePhoto ist seine Methode zum Abrufen von Bildern. Ich habe es bereits zuvor eingestellt und jetzt bekomme ich es zuerst, dann konvertiere ich es und übergebe es separat:

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

`

Dann erhalte ich in der Empfängeraktivität mein Objekt und das Bild als Byte-Array, dekodiere das Bild und setze es als Foto-Eigenschaft auf mein Objekt.

 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
quelle
2

Die Ausnahme trat auf, weil eine der inneren Klassen oder andere referenzierte Klassen die serialisierbare Implementierung nicht implementiert haben. Stellen Sie daher sicher, dass alle referenzierten Klassen die serialisierbare Implementierung implementieren müssen.

Sridhar Shanmugam
quelle
0

Ich bin auch Phase dieser Fehler und ich bin ein wenig Änderung in modelClass, die Serializable Schnittstelle implementiert sind wie:

In dieser Model-Klasse wird auch die Parcelable-Schnittstelle mit der WriteToParcel () - Override-Methode implementiert

Dann habe ich gerade den Fehler "Ersteller erstellen" erhalten, damit CREATOR geschrieben und auch mit einem Modellklassen-Konstruktor mit Argumenten und ohne Argumente erstellt wird .

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

Hier,

ArtistTrackClass -> ModelClass

Konstruktor mit Parcel-Argumenten "Lesen Sie unsere Attribute" und writeToParcel () ist "Schreiben Sie unsere Attribute".

Dhruv Raval
quelle
0

Die Grade-Klasse muss auch Serializable implementieren

public class Grade implements Serializable {
.....your content....
}
yOshi
quelle
0

Müssen alle Arraylisten in Serializable wif in Bean Klasse ändern:

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
quelle
0

Ich hatte das gleiche Problem, das Problem war, dass es einige innere Klassen mit dem statischen Schlüsselwort gab. Nach dem Entfernen des statischen Schlüsselworts begann es zu funktionieren und auch die innere Klasse sollte in Serializable implementiert werden

Problem Szenario

class A implements Serializable{ 
  class static B{
  } 
}

Gelöst von

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

In meinem Fall hatte ich zu implementieren MainActivityals Serializableauch. Ursache Ich musste einen Dienst von meinem 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);
}
Herr Brigante
quelle