web-dev-qa-db-fra.com

Le colis a rencontré IOException en écrivant un objet sérialisable

alors 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'étudiants n'est pas sérialisable, mais voici ma classe d'étudiants:

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

                        } 

                    });

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

voici l'intégralité de 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)
125
user2896762
Caused by: Java.io.NotSerializableException: com.resources.student_list.DSLL$DNode

Votre classe DSLL semble avoir une classe intérieure DNode statique, et DNode n'est pas Serializable.

246
CommonsWare

Votre classe OneThread doit également implémenter Serializable. Toutes lessous-classesetsous-classes internesmust implémentent Serializable .

cela a fonctionné pour moi ...

28
Pankaj Talaviya

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 lorsque vous utilisez Intent.putExtra (...).

22
Francisco Peters

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

2
saigopi

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" en "photo bitmap privée transitoire". Cependant, l'image est vide après que je reçois GetIntent () 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 le transmettons 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 avant de le convertir et de le transmettre 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é de réception, je récupère 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);
2
Pavel Aslanov

Pour moi, cela a été résolu en rendant la variable de 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() {}
}   
2
Gomez NL

Je suis également en phase ces erreurs et je suis peu changement dans modelClass qui sont implémentés Interface sérialisable like:

Dans cette classe de modèle, implémentez également la méthode Parcelable interface with writeToParcel () override 

Puis vient de recevoir une erreur pour "créer créateur" ainsiCR&EACUTE;ATEURest écrit et crée également avec le constructeur modelclass 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 les arguments Parcel "lire nos attributs" et writeToParcel () est "écrire nos attributs"

0
Dhruv Raval

J'ai rencontré le même problème, 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 devait également être implémentée dans Serializable.

Scénario de problème

class A implements Serializable{ 
  class static B{
  } 
}

Résolu par

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

la classe Grade doit également implémenter Serializable

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

Dans mon cas, je devais aussi implémenter MainActivity comme Serializable. Parce que je devais 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);
}
0
Mr Brigante

L'exception est due au fait qu'aucune des classes internes ou autres classes référencées n'implémente sérialisable. Donc, rendre toutes les classes référencées à implémenter sérialisables.

0

Nécessité de changer tous les noms de publications en numéros de série en 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;
        }
    }
 }
0
murugan mani