Comment corriger Unmarshalling unknown type code XXX à offset YYY sous Android?
je vais avoir une panne de l'application sur le CV à cause d'une exception de non-mémorisation. J'ai vérifié que tous les Serializables ont un constructeur sans paramètres et j'ai même vérifié tous les serializables en utilisant ObjectStream (save to file et load from file). Comment puis-je comprendre le type de classe réel pour l'exception de cause par effet de décalage:
Parcel android.os.Parcel@42209460: Unmarshalling unknown type code
2131165303 at offset 3748
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2080)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2105)
at android.app.ActivityThread.access0(ActivityThread.java:136)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4876)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:804)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:571)
at com.kdgdev.xtension.core.XtensionMain.main(XtensionMain.java:91)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42209460: Unmarshalling unknown type code 2131165303
at offset 3748
at android.os.Parcel.readValue(Parcel.java:2032)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:2255)
at android.os.Parcel.readSparseArray(Parcel.java:1687)
at android.os.Parcel.readValue(Parcel.java:2022)
at android.os.Parcel.readMapInternal(Parcel.java:2226)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1232)
at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1690)
at android.app.Activity.onRestoreInstanceState(Activity.java:999)
at com.actionbarsherlock.app.SherlockFragmentActivity.onRestoreInstanceState(Unknown
Source)
at name.myname.android.app.ui.MainActivity.onRestoreInstanceState(Unknown
Source)
at android.app.Activity.performRestoreInstanceState(Activity.java:971)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1130)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2058)
... 12 more
les données sauvegardées se composent de Bundle
et Serializable
s et ils ont l'air bon.
je vais faire le suivant:
try {
// unmarshalling
} catch (Throwable t) {
// look offset
}
Comment puis-je comprendre quel type est en fait pour L'offset séparable?
8 réponses
il y a des règles pour écrire et lire les pièces.
1 - attention à l'inadéquation des types. Si vous écrivez int, n'essayez pas de lire long, etc.
2 - Faites attention à l'ordre d'écriture et de lecture. Les objets doivent être dans le même ordre de lecture et d'écriture.
les Deux peuvent causer des "Unmarshalling type inconnu code".
c'est à cause de L'obfuscation Proguard - il a traité les cellules. solution:Proguard provoquant RuntimeException (Unmarshalling inconnu type de code) dans Parcelable classe
dans mon cas, il est corrigé après la mise à niveau de la bibliothèque de soutien en 23.2.1
Si un type de Liste est ajouté, il doit être:
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeList(this.mList);
et unparcel en utilisant le type de classe comme ceci:
protected MyClass(Parcel in) {
super(in);
this.mList = new ArrayList<>();
in.readList(this.mList, MyRequiredClass.class.getClassLoader());
ce n'est pas une question liée au pronostic.. Mais quand proguard et minify permettent c'est l'occurrence de problème est toujours.
le Problème est dans l'ordre de l'écriture et de la lecture de l'objet...la séquence doit être la même, que c'est comme la lecture du fichier.
vous pouvez utiliser le plug in android studio pour faire la classe comme parcelable https://plugins.jetbrains.com/plugin/7332?pr=
dans mon cas, il a été causé par la taille des données dépassant la limite maximale de ce qui peut être mis à colis qui est d'environ 1 MB.
Solution: optimisez votre code séparable pour mettre le moins de données possible (par exemple, ne pas mettre D'objets sérialisables dans un paquet)
dans mon cas, ma classe n'a pas ajouté CREATOR filed lors de l'extension d'un autre parent séparable.
public class Image implements Parcelable {
protected Image(Parcel in) {
}
public static final Creator<Image> CREATOR = new Creator<Image>() {
@Override
public Image createFromParcel(Parcel in) {
return new Image(in);
}
@Override
public Image[] newArray(int size) {
return new Image[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
}
public class ImageChild extends Image {
protected ImageChild(Parcel in) {
super(in);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
}
}
dans ImageChild champ créateur manquant
en utilisant Kotlin, l'objet 'Nota' a un objet personnalisé 'CentroCusto' qui ne contient que des propriétés primitives.
class Nota(var id: Int? = null, var centroCusto: ArrayList<CentroCusto>? = null) : Parcelable {
constructor(source: Parcel) : this(
source.readValue(Int::class.java.classLoader) as Int?,
//Exception in below line -> Unmarshalling unknown type code
source.createTypedArrayList(CentroCusto.CREATOR)
)
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
writeValue(id)
writeTypedList(centroCusto)
}
companion object {
@JvmField
val CREATOR: Parcelable.Creator<Nota> = object : Parcelable.Creator<Nota> {
override fun createFromParcel(source: Parcel): Nota = Nota(source)
override fun newArray(size: Int): Array<Nota?> = arrayOfNulls(size)
}
}
class CentroCusto(var id: Int? = null, var descricao: String? = null, var aprovacaoDiretoria: Int? = null, var permiteMarcar: Boolean? = null) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString(),
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readValue(Boolean::class.java.classLoader) as? Boolean) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeValue(id)
parcel.writeString(descricao)
parcel.writeValue(aprovacaoDiretoria)
parcel.writeValue(permiteMarcar)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<CentroCusto> {
override fun createFromParcel(parcel: Parcel): CentroCusto {
return CentroCusto(parcel)
}
override fun newArray(size: Int): Array<CentroCusto?> {
return arrayOfNulls(size)
}
}
}