IOException parcelable ha scritto getactivity oggetto serializzabile ()


171

quindi sto ottenendo questo in logcat:

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

So che questo significa che la mia classe di studenti non è serializzabile, ma lo è, ecco la mia classe di studenti:

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

}

e questo è il codice che utilizza il metodo 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);

                        } 

                    });

per favore aiutatemi a capire cosa c'è di sbagliato in questo.

ecco l'intero 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)

Utilizzare LogCat per esaminare l'intera traccia dello stack Java associata all'eccezione. Se non capisci la traccia dello stack, incollala qui. Inoltre, cos'è DSLLe cos'è Grade?
Commons War

DSLL (DoubleSortedLinckedList) e Grade un'altra classe creata da me, entrambi sono anche serializzabili.
user2896762,

Ho pubblicato la traccia dello stack
LogCar

4
Non direttamente correlato, ma ... nel mio caso stavo tentando di serializzare una classe interna definita all'interno di una classe esterna non serializzabile. Ho imparato che le classi interne non statiche contengono un riferimento alla loro classe esterna (vedi questa domanda ).
giraffe.guru,

Risposte:


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

La tua DSLLclasse sembra avere una DNodeclasse interna statica e DNodenon lo è Serializable.


60
@ user2896762: in generale, su Android, inizia dalla parte inferiore della traccia dello stack e prosegui fino all'ultima Caused byriga. Questo di solito indicherà il problema specifico. Tutte le altre stanze della traccia dello stack rappresentano eccezioni avvolte attorno all'eccezione "reale" nella parte inferiore della traccia.
Commons War

3
Avevo appena letto la causa, non lo sapevo da quasi 3 anni in via di sviluppo.
Sterling Diaz,

1
Grazie!!! @ user2896762 & @CommonsWare Ho letto la traccia Stack ... Trovato Uno degli oggetti nella mia classe non è stato serializzato. e ora funziona. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya,

@CommonsWare Come usare il codice sopra. Potete aiutarmi per favore?
Jiks,

4
Ogni classe interna nel modello deve essere serializzata.
Samir Mangroliya,

55

Anche la tua classe OneThread dovrebbe implementare Serializable. Tutte le sottoclassi e le sottoclassi interne devono implementare Serializable .

questo ha funzionato per me ...


24

Se non riesci a rendere serializzabile DNode, una buona soluzione sarebbe quella di aggiungere "transitorio" alla variabile.

Esempio:

public static transient DNode dNode = null;

Ciò ignorerà la variabile quando si utilizza Intent.putExtra (...).


2
La transientparola chiave in Java viene utilizzata per indicare che un campo non deve essere serializzato. Risposta completa qui: stackoverflow.com/a/910522/1306012
Bruno Bieri

8

se POJO contiene al suo interno qualsiasi altro modello che dovrebbe implementare anche Serializable


5

Per me questo è stato risolto rendendo transitoria la variabile all'interno della classe.

Codice prima di:

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

codice dopo

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

Questo non può funzionare per me. Non posso renderlo transitorio perché in realtà ho bisogno del valore di quella variabile da qualche altra parte nella mia base di codice.
Taslim Oseni,

Questo mi ha aiutato. Grazie
vipera

2

Il problema si verifica quando la tua classe personalizzata ha per proprietà un'altra classe, ad esempio "Bitmap". Quello che ho fatto è cambiare il campo delle proprietà da "foto bitmap privata" a "foto bitmap transitoria privata". Tuttavia, l'immagine è vuota dopo che getIntent () nell'attività del ricevitore. Per questo motivo ho passato la classe personalizzata all'intento e ho anche creato una matrice di byte dall'immagine e passata separatamente all'intento:

selectedItem è il mio oggetto personalizzato e getPlacePhoto è il suo metodo per ottenere l'immagine. L'ho già impostato prima e ora lo capisco prima di convertirlo e passarlo separatamente:

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

`

Quindi nell'attività del ricevitore ottengo il mio oggetto e l'immagine come array di byte, decodifica l'immagine e la imposto sul mio oggetto come proprietà fotografica.

 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

L'eccezione è dovuta al fatto che nessuna delle classi interne o altre classi referenziate non ha implementato l'implementazione serializzabile. Quindi assicurati che tutte le classi di riferimento debbano implementare l'implementazione serializzabile.


0

Sto anche eliminando questi errori e sto cambiando un po 'in modelClass che sono implementati come interfaccia serializzabile come:

A quella classe Model implementare anche l' interfaccia Parcelable con il metodo di override writeToParcel ()

Quindi ho appena ricevuto l'errore di "creare creatore", quindi CREATOR è scrivere e anche creare con il modello controlcector con argomenti e senza argomenti .

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

Qui,

ArtistTrackClass -> ModelClass

Il costruttore con argomenti Parcel "leggi i nostri attributi" e writeToParcel () è "scrivi i nostri attributi"


0

la classe Grade deve anche implementare Serializable

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

0

È necessario modificare tutto l'arraylist in serializzabile wif nella classe 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

Ho riscontrato lo stesso problema, i problemi erano che ci sono alcune classi interne con la parola chiave statica.Dopo aver rimosso la parola chiave statica ha iniziato a funzionare e anche la classe interna dovrebbe implementare Serializable

Scenario di emissione

class A implements Serializable{ 
  class static B{
  } 
}

Risolto da

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }

0

Nel mio caso ho dovuto implementare MainActivitycome Serializabletroppo. Perché avevo bisogno di avviare un servizio dal mio 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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.