Parcelable encontró IOException escribiendo getactivity objeto serializable ()

171

así que obtengo esto en logcat:

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

Sé que esto significa que mi clase de estudiante no es serializable, pero sí, aquí está mi clase de estudiante:

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

}

y este es el código que usa el método 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);

                        } 

                    });

por favor, ayúdame a descubrir qué hay de malo en esto.

Aquí está todo el 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)
usuario2896762
fuente
Use LogCat para examinar todo el seguimiento de la pila Java asociado con su excepción. Si no comprende el seguimiento de la pila, péguelo aquí. Además, ¿qué es DSLLy qué es Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) y Grade otra clase creada por mí, ambos también son serializables.
user2896762
He publicado el rastro LogCar pila
user2896762
44
No está directamente relacionado, pero ... en mi caso estaba intentando serializar una clase interna definida dentro de una clase externa no serializable. Aprendí que las clases internas no estáticas contienen una referencia a su clase externa (vea esta pregunta ).
giraffe.guru

Respuestas:

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

Su DSLLclase parece tener una DNodeclase interna estática, y DNodeno lo es Serializable.

CommonsWare
fuente
6060
@ user2896762: en general, en Android, comience desde la parte inferior de la traza de la pila y avance hasta la última Caused bylínea. Eso generalmente va a señalar el problema específico. Todas las otras estrofas de la traza de la pila representan excepciones envueltas alrededor de la excepción "real" en la parte inferior de la traza.
CommonsWare
3
Acabo de leer lo causado por, no sabía esto durante casi 3 años en desarrollo.
Sterling Diaz
1
¡¡¡Gracias!!! @ user2896762 y @CommonsWare Leí el seguimiento de la pila ... Encontrado Uno de los objetos de mi clase no estaba serializado. y ahora está funcionando Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Cómo usar el código anterior. ¿Me pueden ayudar por favor?
Jiks
44
Todas y cada una de las clases internas en Model deben ser serializadas.
Samir Mangroliya
55

Su clase OneThread también debe implementar Serializable. Todas las subclases y subclases internas deben implementar Serializable .

esto me funcionó ...

Pankaj Talaviya
fuente
24

Si no puede hacer que DNode sea serializable, una buena solución sería agregar "transitorio" a la variable.

Ejemplo:

public static transient DNode dNode = null;

Esto ignorará la variable cuando use Intent.putExtra (...).

Francisco Peters
fuente
2
La transientpalabra clave en Java se usa para indicar que un campo no debe ser serializado. Respuesta completa aquí: stackoverflow.com/a/910522/1306012
Bruno Bieri
8

si POJO contiene algún otro modelo dentro que también debería implementar Serializable

Sai Gopi N
fuente
5

Para mí, esto se resolvió haciendo que la variable dentro de la clase fuera transitoria.

Código antes:

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

código después

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Gomez NL
fuente
Esto no puede funcionar para mí. No puedo hacerlo transitorio porque realmente necesito el valor de esa variable en otro lugar de mi base de código.
Taslim Oseni
Esto me ayudo. Gracias
víbora
2

El problema ocurre cuando su clase personalizada tiene como propiedad alguna otra clase, por ejemplo, "Mapa de bits". Lo que hice es cambiar el campo de propiedad de "foto de mapa de bits privada" a "foto de mapa de bits transitoria privada". Sin embargo, la imagen está vacía después de obtener getIntent () en la actividad del receptor. Debido a esto, pasé la clase personalizada a la intención y también creé una matriz de bytes de la imagen y la pasé por separado a la intención:

selectedItem es mi objeto personalizado y getPlacePhoto es su método para obtener imágenes. Ya lo configuré antes y ahora solo lo obtengo primero que convertirlo y pasarlo por separado:

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

``

Luego, en la actividad del receptor, obtengo mi objeto y la imagen como una matriz de bytes, decodifico la imagen y la configuro en mi objeto como propiedad de 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);
Pavel Aslanov
fuente
2

La excepción ocurrió debido al hecho de que ninguna de las clases internas u otras clases referenciadas no implementaron la implementación serializable. Por lo tanto, asegúrese de que todas las clases referenciadas deben implementar la implementación serializable.

Sridhar Shanmugam
fuente
0

También estoy borrando estos errores y estoy cambiando un poco en modelClass que se implementan en la interfaz serializable como:

En esa clase de modelo, también implemente la interfaz Parcelable con el método de anulación writeToParcel ()

Luego recibí un error de "crear creador", por lo que CREATOR es escribir y también crear con modelclass contructor con argumentos y sin argumentos .

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

Aquí,

ArtistTrackClass -> ModelClass

El constructor con argumentos de parcela "lee nuestros atributos" y writeToParcel () es "escribe nuestros atributos"

Dhruv Raval
fuente
0

la clase Grade también debe implementar Serializable

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

Necesita cambiar todos los arraylist a Serializable wif en la clase 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;
        }
    }
 }
murugan mani
fuente
0

Me enfrenté al mismo problema, el problema era que había algunas clases internas con la palabra clave estática. Después de eliminar la palabra clave estática, comenzó a funcionar y también la clase interna debería implementarse en Serializable

Escenario de problema

class A implements Serializable{ 
  class static B{
  } 
}

Resuelto por

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

En mi caso he tenido que aplicar MainActivitycomo Serializabletambién. Porque necesitaba iniciar un servicio desde mi 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);
}
Señor brigante
fuente