ClassCastException al intentar hacer readParcelable en un arreglo de objetos personalizado

Estoy tratando de implementar Parcelable en lugar de Serializble como se supone que es más eficiente. Desde mi MainActivity Quiero pasar un objeto Mensaje a otra actividad, mi clase Mensaje contiene otras clases. Si logro superar este error, estoy seguro de que correré a más de ellos, pero ahora mismo cuando intento ejecutar mi aplicación, estoy recibiendo

Esta es mi clase de mensaje:

import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; public class Message implements Parcelable { int id; int space_id; String text; String html; String created_at; int[] comments; boolean is_liked; int[] liked_by; int[] starred_by; boolean is_starred; boolean is_followed; int[] followed_by; ArrayList<AttachmentsData> attachments; String url; int[] tags; boolean is_system; public User created_by; public Permissions persmissions; public Embed embed; public Tokens[] tokens; /** Parcelable **/ public Message(Parcel in) { readFromParcel(in); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeInt(space_id); dest.writeString(text); dest.writeString(html); dest.writeString(created_at); dest.writeIntArray(comments); dest.writeInt(is_liked ? 1 : 0); dest.writeIntArray(liked_by); dest.writeIntArray(starred_by); dest.writeInt(is_starred ? 1 : 0); dest.writeInt(is_followed ? 1 : 0); dest.writeIntArray(followed_by); dest.writeList(attachments); dest.writeString(url); dest.writeIntArray(tags); dest.writeInt(is_system ? 1 : 0); dest.writeParcelable(created_by, flags); dest.writeParcelable(persmissions, flags); dest.writeParcelable(embed, flags); dest.writeParcelableArray(tokens, flags); } private void readFromParcel(Parcel in) { id = in.readInt(); space_id = in.readInt(); text = in.readString(); html = in.readString(); created_at = in.readString(); //in.readIntArray(comments); comments = in.createIntArray(); is_liked = in.readInt() == 0; //in.readIntArray(liked_by); liked_by = in.createIntArray(); //in.readIntArray(starred_by); starred_by = in.createIntArray(); is_starred = in.readInt() == 0; is_followed = in.readInt() == 0; //in.readIntArray(followed_by); followed_by = in.createIntArray(); in.readList(attachments, AttachmentsData.class.getClassLoader()); url = in.readString(); //in.readIntArray(tags); tags = in.createIntArray(); is_system = in.readInt() == 0; created_by = in.readParcelable(User.class.getClassLoader()); persmissions = in.readParcelable(Permissions.class.getClassLoader()); embed = in.readParcelable(Embed.class.getClassLoader()); tokens = in.readParcelable(Tokens.class.getClassLoader(); } public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() { public Message createFromParcel(Parcel in) { return new Message(in); } public Message[] newArray(int size) { return new Message[size]; } }; /** Getters and setters, I'll spare you these **/ } 

Y este es el error que estoy recibiendo:

EXCEPCIÓN FATAL: principal java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {com.example.incentive / com.example.incentive.Comments}: java.lang.ClassCastException: android.os.Parcelable [] no se puede convertir en com. Ejemplo.incentive.messagemodel.Tokens [] en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1967) en android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1992) en android.app.ActivityThread.access $ 600 (ActivityThread .java: 127) en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1158) en android.os.Handler.dispatchMessage (Handler.java:99) en android.os.Looper.loop (Looper.java: 137) en android.app.ActivityThread.main (ActivityThread.java:4441) en java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect.Method.invoke (Method.java:511) at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551) en dalvik.system.NativeStart.main (Método nativo) Causado por: java.lang.ClassCastException: android.os.Parcelable [] no se puede convertir en com.example.incentive.messagemodel.Tokens [] en com.example.incentive.messagemodel.Message.readFromParcel (Message. Java: 94) at com.example.incentive.messagemodel.Message. (Message.java:35) at com.example.incentive.messagemodel.Message $ 1.createFromParcel (Message.java:100) at com.example.incentive.messagemodel .Message $ 1.createFromParcel (Message.java:1) en android.os.Parcel.readParcelable (Parcel.java:1992) en android.os.Parcel.readValue (Parcel.java:1854) en android.os.Parcel.readMapInternal (Parcel.java:2094) en android.os.Bundle.unparcel (Bundle.java:223) en android.os.Bundle.getParcelable (Bundle.java:1158) en com.example.incentive.Comments.onCreate (Comentarios. Java: 67) en android.app.Activity.performCreate (Activity.java:4465) en android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1049) en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1931). .. 11 más

Estoy pensando que el relevante ahora es:

Causado por: java.lang.ClassCastException: android.os.Parcelable [] no se puede convertir en com.example.incentive.messagemodel.Tokens [] en com.example.incentive.messagemodel.Message.readFromParcel (Message.java:94)

Así que probablemente estoy haciendo esto mal: tokens = in.readParcelable (Tokens.class.getClassLoader ();

Aquí está mi clase Tokens:

 import android.os.Parcel; import android.os.Parcelable; public class Tokens implements Parcelable { String type; String value; int start; int end; /** Parcelable related **/ @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(type); dest.writeString(value); dest.writeInt(start); dest.writeInt(end); } private Tokens(Parcel in) { type = in.readString(); value = in.readString(); start = in.readInt(); end = in.readInt(); } public static final Parcelable.Creator<Tokens> CREATOR = new Parcelable.Creator<Tokens>() { public Tokens createFromParcel(Parcel in) { return new Tokens(in); } public Tokens[] newArray(int size) { return new Tokens[size]; } }; /** Getters and setters **/ } 

He buscado toda la tarde y no puedo ver para encontrar cómo hacerlo correctamente. ¿Alguien sabe?

Utilice writeTypedArray y readTypedArray para leer y escribir su matriz en la parcela

Leer

 tokens = in.createTypedArray(Tokens.CREATOR); 

Escribir

 in.writeTypedArray(tokens, flags); 

prueba esto…

reemplazar

  tokens = in.readParcelable(Tokens.class.getClassLoader(); 

con

  tokens = in.readParcelableArray(Tokens.class.getClassLoader()); 

Está escribiendo Parcelable Array pero lo lee como Parcelable

  • Parcelable y herencia
  • Transmisión de JSONObject a otra actividad
  • ¿Cómo arreglar Unmarshalling código de tipo desconocido XXX en el desplazamiento YYY en Android?
  • No se puede implementar Parcelable porque no puedo hacer que el campo CREATOR esté estático
  • Android: causas unparceling fuera de la excepción de memoria. ¿Cómo inspeccionar objetos?
  • Paso de arraylist de objetos entre actividades
  • Objeto que implementa la interfaz Parcelable que contiene una lista lanza una excepción NullPointerException
  • Pase de ArrayList <? implementa Parcelable> a Actividad
  • Implementar interfaz parcelable utilizando Gson
  • Pasar ArrayList <CustomObject> entre actividades
  • GetParcelableArrayList devuelve null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.