J'ai quelques classes qui implémentent Parcelable et certaines de ces classes se contiennent mutuellement comme propriétés. Je rassemble les classes dans un fichier Parcelle pour les transmettre entre les activités. Les transférer vers le colis fonctionne bien, mais lorsque j'essaie de les retirer, j'obtiens l'erreur suivante :
...
AndroidRuntime E Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: schemas.Arrivals.LocationType
AndroidRuntime E at android.os.Parcel.readParcelable(Parcel.java:1822)
AndroidRuntime E at schemas.Arrivals.LayoverType.<init>(LayoverType.java:121)
AndroidRuntime E at schemas.Arrivals.LayoverType.<init>(LayoverType.java:120)
AndroidRuntime E at schemas.Arrivals.LayoverType$1.createFromParcel(LayoverType.java:112)
AndroidRuntime E at schemas.Arrivals.LayoverType$1.createFromParcel(LayoverType.java:1)
AndroidRuntime E at android.os.Parcel.readTypedList(Parcel.java:1509)
AndroidRuntime E at schemas.Arrivals.BlockPositionType.<init>(BlockPositionType.java:244)
AndroidRuntime E at schemas.Arrivals.BlockPositionType.<init>(BlockPositionType.java:242)
AndroidRuntime E at schemas.Arrivals.BlockPositionType$1.createFromParcel(BlockPositionType.java:234)
AndroidRuntime E at schemas.Arrivals.BlockPositionType$1.createFromParcel(BlockPositionType.java:1)
...
El LayoverType
(où il échoue) :
public class LayoverType implements Parcelable {
protected LocationType location;
protected long start;
protected long end;
public LayoverType() {}
public LocationType getLocation() {
return location;
}
public void setLocation(LocationType value) {
this.location = value;
}
public long getStart() {
return start;
}
public void setStart(long value) {
this.start = value;
}
public long getEnd() {
return end;
}
public void setEnd(long value) {
this.end = value;
}
// **********************************************
// for implementing Parcelable
// **********************************************
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(location, flags);
dest.writeLong(start);
dest.writeLong(end );
}
public static final Parcelable.Creator<LayoverType> CREATOR = new Parcelable.Creator<LayoverType>() {
public LayoverType createFromParcel(Parcel in) {
return new LayoverType(in);
}
public LayoverType[] newArray(int size) {
return new LayoverType[size];
}
};
private LayoverType(Parcel dest) {
location = (LocationType) dest.readParcelable(null); // it's failing here
start = dest.readLong();
end = dest.readLong();
}
}
Voici le LocationType
classe :
public class LocationType implements Parcelable {
protected int locid;
protected String desc;
protected String dir;
protected double lat;
protected double lng;
public LocationType() {}
public int getLocid() {
return locid;
}
public void setLocid(int value) {
this.locid = value;
}
public String getDesc() {
return desc;
}
public void setDesc(String value) {
this.desc = value;
}
public String getDir() {
return dir;
}
public void setDir(String value) {
this.dir = value;
}
public double getLat() {
return lat;
}
public void setLat(double value) {
this.lat = value;
}
public double getLng() {
return lng;
}
public void setLng(double value) {
this.lng = value;
}
// **********************************************
// for implementing Parcelable
// **********************************************
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt (locid);
dest.writeString(desc );
dest.writeString(dir );
dest.writeDouble(lat );
dest.writeDouble(lng );
}
public static final Parcelable.Creator<LocationType> CREATOR = new Parcelable.Creator<LocationType>() {
public LocationType createFromParcel(Parcel in) {
return new LocationType(in);
}
public LocationType[] newArray(int size) {
return new LocationType[size];
}
};
private LocationType(Parcel dest) {
locid = dest.readInt ();
desc = dest.readString();
dir = dest.readString();
lat = dest.readDouble();
lng = dest.readDouble();
}
}
Mise à jour 2 : Pour autant que je puisse dire, il échoue au niveau du bout de code suivant (tiré de Source de la parcelle ):
Class c = loader == null ? Class.forName(name) : Class.forName(name, true, loader);
Pourquoi ne parvient-il pas à trouver la classe ? Elle existe et implémente à la fois Parcelable
.
0 votes
Pourriez-vous afficher le code de la classe LocationType ? Il se peut que la méthode d'écriture de cette classe ne soit pas correcte d'une certaine manière.
0 votes
@MpKamowski : J'ai ajouté les bits Parcelable de LocationType. Les seuls autres éléments dans les deux classes sont juste des getters/setters.
0 votes
Est-il possible que le paquet dont LocationType fait partie ne soit pas visible dans le code où il est désarchivé ?
0 votes
Je ne vois pas comment.
LocationType
yLayoverType
sont dans le même paquet. Je suis allé de l'avant et j'ai essayé d'importer implicitementLocationType
surLayoverType
et ça n'a fait aucune différence.0 votes
Pourriez-vous poster le code complet de vos deux classes ? Je suis particulièrement intéressé par LocationType pour savoir si c'est une classe interne statique publique ou non.
0 votes
Je suis allé de l'avant et j'ai tout inclus sauf la ligne du paquet et les importations. J'espère que cela vous aidera et merci d'y avoir jeté un coup d'œil.
0 votes
Duplication possible de "BadParcelableException : ClassNotFoundException when unmarshalling <myclass>" lors de l'utilisation de la méthode Parcel.read qui a un ClassLoader comme argument