parcelize data android parcelable

android - data - Objeto parcelable anidado que no lee



kotlin parcelize data class (1)

Estoy tratando de parcelar un objeto que contiene algunas variables de cadena / int y una variable de objeto. Las cadenas y los int funcionan, pero no el objeto anidado. Entiendo que también tendría que ser parcelable, pero aparentemente estoy haciendo algo mal =. En mi clase anidada, se writeToParcel método Log.d() con una llamada Log.d() ), pero createFromParcel() no lo hace. Termino consiguiendo un objeto null . Este es mi código simplificado:

public class MyClass implements Parcelable { public MyClass() { } private Integer id; private String name; private MyOtherClass otherClass = new MyOtherClass(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public OtherClass getOtherClass() { return otherClass; } public void setOtherClass(OtherClass otherClass) { this.otherClass = otherClass; } public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() { public MyClass createFromParcel(Parcel in) { return new MyClass(in); } public MyClass[] newArray(int size) { return new MyClass[size]; } }; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(id); dest.writeParcelable(otherClass, flags); } private MyClass(Parcel in) { name = in.readString(); id = in.readInt(); otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); } } class MyOtherClass implements Parcelable { public OtherClass() { } private String resourcePreviewURL; public String getResourcePreviewURL() { return resourcePreviewURL; } public void setResourcePreviewURL(String resourcePreviewURL) { this.resourcePreviewURL = resourcePreviewURL; } public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { Log.d("parcel", "write to parcel"); // this gets called out.writeString(resourcePreviewURL); } public static final Parcelable.Creator<MyOtherClass> CREATOR = new Parcelable.Creator<MyOtherClass>() { public MyOtherClass createFromParcel(Parcel in) { Log.d("parcel", "create from parcel"); // this doesn''t get called return new MyOtherClass(in); } public ResourcePreviews[] newArray(int size) { return new ResourcePreviews[size]; } }; private OtherClass(Parcel in) { Log.d("parcel", "read from parcel"); // this doesn''t get called resourcePreviewURL = in.readString(); } }


Resolví esto cambiando el orden en el que escribo / leo desde el paquete. Hice el dest.writeParcelable(otherClass, flags); y the otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); Llama a ser el primero en sus métodos y comenzó a funcionar. ¿Es eso un problema?

@Override public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(otherClass, flags); dest.writeString(name); dest.writeInt(id); } private MyClass(Parcel in) { otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); name = in.readString(); id = in.readInt(); }