2014-02-18 6 views
14

Ich habe einen App-Absturz wegen der Unmarshalling-Ausnahme im Lebenslauf. Ich habe alle serializables haben Konstruktor ohne Parameter überprüft und sogar alle serialisables mit ObjectStream überprüft (in Datei speichern und aus Datei laden). Wie kann ich verstehen Typ eigentliche Klasse für Parcel dieser Ursache Ausnahme Offset:Wie Unmarshalling unbekannten Code XXX bei Offset YYY in Android zu beheben?

Parcel [email protected]: 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.access$600(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 [email protected]: 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 

gespeicherten Daten bestehen aus Bundle s und Serializable s und alle von ihnen gut aussehen.

Ich werde das als nächstes tun:

try { 
// unmarshalling 
} catch (Throwable t) { 
// look offset 
} 

Wie kann ich verstehen, welche Art ist eigentlich für Parcel Offset?

+0

es mir passiert ist, weil ich nicht einen int-Wert von meinem Paket gelesen hat (aber es war zu schreiben). Es hat alles versaut und die App ist abgestürzt. – Sufian

Antwort

8

Es ist wegen Proguard Verschleierung - Parcelable verarbeitet. Lösung: Proguard causing RuntimeException (Unmarshalling unknown type code) in Parcelable class

+5

Das gleiche Problem, aber es passiert beim Debuggen, also ist das keine Lösung für mich - eine andere Idee? – Srneczek

+0

@Srneczek Haben Sie eine Lösung gefunden? Ist es nur auf 6.x oder anderen Versionen passiert? –

+0

@ ab.helly nein, ich kann mich nicht erinnern, welches Problem es war - Wenn ich wieder auf dieses Problem stoße, kann ich Ihnen antworten, aber ich denke, dass ich einen anderen Ansatz verwendet habe, um Fehler zu vermeiden – Srneczek

4

In meinem Fall ist es fest nach Support-Bibliothek zu 23.2.1

+0

Ich frage mich, was das Problem war, denn ich sehe keine verwandten Problem auf https://developer.android.com/topic/libraries/support-library/revisions.html – TWiStErRob

2

Upgrade Es ist nicht verwandtes Thema ProGuard .. Aber wenn proguard und minifizieren ermöglichen es Problem Auftreten immer ist.

Problem ist in der Reihenfolge des Schreibens und des Lesens von Objekt ... Sequenz sollte gleich sein, wie es ist, Datei zu lesen.

können Sie android Studio verwenden für Make-Klasse stecken als parcel https://plugins.jetbrains.com/plugin/7332?pr=

20

ist es, einige Regeln für Schreib- und parcelables lesen.

1- Achten Sie darauf, dass der Typ nicht übereinstimmt. Wenn Sie int schreiben, versuchen Sie nicht, lange usw. zu lesen.

2- Seien Sie vorsichtig über die Reihenfolge der Schreib- und Lesevorgänge. Objekte müssen beim Lesen und Schreiben die gleiche Sortierreihenfolge haben.

Beides kann zum "Unmarshalling unbekannter Code" führen.

+1

Das war meine Lösung: Seien Sie vorsichtig über die Reihenfolge der schreibt und liest. Objekte müssen beim Lesen und Schreiben die gleiche Sortierreihenfolge haben. – Kostya

0

In meinem Fall wurde es verursacht durch die Datengröße, die das maximale Limit überschreitet, das auf Paket gesetzt werden kann, das ungefähr 1 MB ist.

Lösung: Ihr Parcel Code optimieren, da weniger Daten wie möglich zu setzen

2

Wenn eine Art von Liste hinzugefügt wird (zB nicht Serializable Objekte Parcel setzen Sie), sollte es sein:

@Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
     dest.writeList(this.mList); 

und unparcel es den Klassentyp wie folgt aus:

protected MyClass(Parcel in) { 
     super(in); 
     this.mList = new ArrayList<>(); 
     in.readList(this.mList, MyRequiredClass.class.getClassLoader()); 
0

In meinem Fall meine Klasse nicht hinzugefügt CREATOR eingereicht, wenn sie von einem anderen Parcel Elternteil erstreckt.

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

In ImageChild CREATOR Feld fehlt

0

Mit Kotlin, das Objekt 'Nota' hat ein benutzerdefiniertes Objekt 'CentroCusto', die nur primitive Eigenschaften enthält.

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

Die CentroCusto Klasse:

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

}