Parcelable et inheritance dans Android

J’ai eu une implémentation de Parcelable travaillant pour une seule classe qui n’implique aucun inheritance. J’ai du mal à trouver le meilleur moyen d’implémenter l’interface en matière d’inheritance. Disons que j’ai ceci:

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 question est la suivante: quelle est la méthode recommandée pour implémenter l’interface Parcelable pour B (dans A? Dans les deux? Comment?)

Voici ma meilleure solution, je serais heureux d’entendre des commentaires de quelqu’un.

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

Ceci est ma variante. Je pense que c’est bien car cela montre très clairement la symésortinge entre les méthodes de lecture et d’écriture virtuelles.

Note: Je pense que Google a fait un très mauvais travail dans la conception de l’interface 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(); } } 

Voici l’implémentation de la classe A dans un environnement réel puisque la classe B aura probablement plus d’un object avec des types différents autres que int

Il utilise la reflection pour obtenir les types. Ensuite, utilise une fonction de sorting pour sortinger les champs afin que la lecture et l’écriture se produisent dans le même ordre.

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