Parcelable y herencia en Android

Obtuve una implementación de Parcelable trabajando para una sola clase que no implica herencia. Tengo problemas para descubrir la mejor manera de implementar la interfaz cuando se trata de herencia. Digamos que tengo esto:

public abstract class A { private int a; protected A(int a) { this.a = a; } } public class B extends A { private int b; public B(int a, int b) { super(a); this.b = b; } } 

La pregunta es, ¿cuál es la forma recomendada de implementar la interfaz Parcelable para B (en A? En ambos? ¿Cómo?)

Esta es mi mejor solución, me alegraría saber de alguien que tuvo un pensamiento al respecto.

 public abstract class A implements Parcelable { private int a; protected A(int a) { this.a = a; } public void writeToParcel(Parcel out, int flags) { out.writeInt(a); } protected A(Parcel in) { a = in.readInt(); } } public class B extends A { private int b; public B(int a, int b) { super(a); this.b = b; } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public B createFromParcel(Parcel in) { return new B(in); } public B[] newArray(int size) { return new B[size]; } }; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(b); } private B(Parcel in) { super(in); b = in.readInt(); } } 

Esta es mi variante. Creo que es bueno porque muestra la simetría entre los métodos virtuales de lectura y escritura muy claramente.

Nota al margen: creo que Google hizo un trabajo realmente pobre al diseñar la interfaz Parcelable.

 public abstract class A implements Parcelable { private int a; protected A(int a) { this.a = a; } public void writeToParcel(Parcel out, int flags) { out.writeInt(a); } public void readFromParcel(Parcel in) { a = in.readInt(); } } public class B extends A { private int b; public B(int a, int b) { super(a); this.b = b; } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public B createFromParcel(Parcel in) { B b = new B(); b(in); return b; } public B[] newArray(int size) { return new B[size]; } }; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(b); } public void readFromParcel(Parcel in) { super(in); b = in.readInt(); } } 

Aquí está la implementación para la clase A en un entorno del mundo real ya que la clase B probablemente tendrá más de un objeto con tipos diferentes a int

Utiliza la reflexión para obtener los tipos. Luego utiliza una función de clasificación para ordenar los campos de modo que la lectura y la escritura sucedan en el mismo orden.

https://github.com/awadalaa/Android-Global-Parcelable