Parcelable a rencontré IOException en écrivant un objet sérialisable getactivity ()

171

donc je reçois ceci dans logcat:

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

Je sais que cela signifie que ma classe d'élèves n'est pas sérialisable, mais c'est le cas, voici ma classe d'élèves:

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

}

et voici le code qui utilise la méthode 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);

                        } 

                    });

s'il vous plaît, aidez-moi à comprendre ce qui ne va pas avec cela.

voici l'ensemble du 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
la source
Utilisez LogCat pour examiner l'intégralité de la trace de la pile Java associée à votre exception. Si vous ne comprenez pas la trace de la pile, collez-la ici. Aussi, qu'est-ce que c'est DSLLet qu'est-ce que c'est Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) et Grade une autre classe créée par moi, les deux sont également sérialisables.
user2896762
J'ai posté la trace de la pile LogCar
user2896762
4
Pas directement lié, mais ... dans mon cas, j'essayais de sérialiser une classe interne définie à l'intérieur d'une classe externe non sérialisable. J'ai appris que les classes internes non statiques contiennent une référence à leur classe externe (voir cette question ).
giraffe.guru

Réponses:

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

Votre DSLLclasse semble avoir une DNodeclasse interne statique, et DNodene l'est pas Serializable.

CommonsWare
la source
60
@ user2896762: En général, sur Android, commencez par le bas de la trace de pile et progressez jusqu'à la dernière Caused byligne. Cela va généralement pointer vers le problème spécifique. Toutes les autres strophes de la trace de pile représentent des exceptions encapsulées autour de l'exception "réelle" au bas de la trace.
CommonsWare
3
Je viens de lire le provoqué par, je ne le savais pas depuis près de 3 ans en développement.
Sterling Diaz
1
Merci!!! @ user2896762 & @CommonsWare J'ai lu la trace de la pile ... Trouvé L'un des objets de ma classe n'était pas sérialisé. et maintenant cela fonctionne. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Comment utiliser le code ci-dessus. Pouvez-vous m'aider pls?
Jiks
4
Chaque classe interne de Model doit être sérialisée.
Samir Mangroliya
55

Votre classe OneThread doit également implémenter Serializable. Toutes les sous-classes et sous-classes internes doivent implémenter Serializable .

cela a fonctionné pour moi ...

Pankaj Talaviya
la source
24

Si vous ne pouvez pas rendre DNode sérialisable, une bonne solution serait d'ajouter "transitoire" à la variable.

Exemple:

public static transient DNode dNode = null;

Cela ignorera la variable lors de l'utilisation de Intent.putExtra (...).

Francisco Peters
la source
2
Le transientmot clé en Java est utilisé pour indiquer qu'un champ ne doit pas être sérialisé. Réponse complète ici: stackoverflow.com/a/910522/1306012
Bruno Bieri
8

si votre POJO contient un autre modèle à l'intérieur qui devrait également implémenter Serializable

Sai Gopi N
la source
5

Pour moi, cela a été résolu en rendant la variable avec la classe transitoire.

Code avant:

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

code après

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Gomez NL
la source
Cela ne peut pas fonctionner pour moi. Je ne peux pas le rendre transitoire car j'ai réellement besoin de la valeur de cette variable ailleurs dans ma base de code.
Taslim Oseni
Cela m'a aidé. Merci
viper
2

Le problème se produit lorsque votre classe personnalisée a pour propriété une autre classe, par exemple "Bitmap". Ce que j'ai fait est de changer le champ de propriété de "photo Bitmap privée" à "photo Bitmap transitoire privée". Cependant, l'image est vide après avoir obtenuIntent () dans l'activité du récepteur. Pour cette raison, j'ai passé la classe personnalisée à l'intention et j'ai également créé un tableau d'octets à partir de l'image et je le transmets séparément à l'intention:

selectedItem est mon objet personnalisé et getPlacePhoto est sa méthode pour obtenir une image. Je l'ai déjà défini auparavant et maintenant je l'obtiens d'abord, puis je le convertis et je le transmets séparément:

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

»

Ensuite, dans l'activité du récepteur, j'obtiens mon objet et l'image sous forme de tableau d'octets, décode l'image et la définit sur mon objet en tant que propriété photo.

 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
la source
2

L'exception s'est produite en raison du fait qu'aucune des classes internes ou autres classes référencées n'a implémenté l'implémentation sérialisable. Assurez-vous donc que toutes les classes référencées doivent implémenter l'implémentation sérialisable.

Sridhar Shanmugam
la source
0

Je suis également la phase de ces erreurs et je suis un petit changement dans modelClass qui est implémenté en interface sérialisable comme:

Dans cette classe Model, implémentez également l' interface Parcelable avec la méthode de substitution writeToParcel ()

Ensuite, il y a une erreur pour "créer le créateur", donc CREATOR est en écriture et crée également avec le constructeur de classe de modèle avec des arguments et sans arguments .

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

Ici,

ArtistTrackClass -> ModelClass

Constructeur avec des arguments Parcel "lire nos attributs" et writeToParcel () est "écrire nos attributs"

Dhruv Raval
la source
0

la classe Grade doit également implémenter Serializable

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

Besoin de changer tous les arraylist en wif sérialisable dans la classe de haricots:

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
la source
0

J'ai rencontré le même problème, le problème était qu'il y avait des classes internes avec le mot-clé static.Après avoir supprimé le mot-clé static, il a commencé à fonctionner et la classe interne devrait également implémenter Serializable

Scénario de problème

class A implements Serializable{ 
  class static B{
  } 
}

Résolu par

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }
sunil KV
la source
0

Dans mon cas, j'ai dû mettre MainActivityen œuvre Serializableaussi. Parce que j'avais besoin de démarrer un service à partir de mon 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);
}
Monsieur Brigante
la source