2015-12-18 58 views
4

我已經收到此錯誤: -解組類型代碼和偏移值及其含義?

java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 30 at offset 8804 

我已經通過這個解決方案變本加厲之後:在我的Android應用https://stackoverflow.com/a/21380449/2492278

這可能是一個重複的問題,但我有不同的解決方案了提示:

1)中的ProGuard的conf文件更改。

2.)檢查讀取和寫入分析操作是否在相同的數據類型上執行。

和許多其他來自各種線程的解決方案,但這並不能解決我的問題。

主要是,有沒有人知道未知類型代碼xxxx和抵消yyyy是什麼意思。我的意思是這兩個值究竟意味着什麼?

更新: -

我是滾動的代碼,我發現,這個異常基本上會從readValue()功能屬於android.os.Parcel它接受ClassLoaderloader對象拋出。

public final Object readValue(ClassLoader loader) { 
     int type = readInt(); 
    switch (type) { 
    case VAL_NULL: 
     return null; 

    case VAL_STRING: 
     return readString(); 

    case VAL_INTEGER: 
     return readInt(); 

    case VAL_MAP: 
     return readHashMap(loader); 

    case VAL_PARCELABLE: 
     return readParcelable(loader); 

    case VAL_SHORT: 
     return (short) readInt(); 

    case VAL_LONG: 
     return readLong(); 

    case VAL_FLOAT: 
     return readFloat(); 

    case VAL_DOUBLE: 
     return readDouble(); 

    case VAL_BOOLEAN: 
     return readInt() == 1; 

    case VAL_CHARSEQUENCE: 
     return readCharSequence(); 

    case VAL_LIST: 
     return readArrayList(loader); 

    case VAL_BOOLEANARRAY: 
     return createBooleanArray();   

    case VAL_BYTEARRAY: 
     return createByteArray(); 

    case VAL_STRINGARRAY: 
     return readStringArray(); 

    case VAL_CHARSEQUENCEARRAY: 
     return readCharSequenceArray(); 

    case VAL_IBINDER: 
     return readStrongBinder(); 

    case VAL_OBJECTARRAY: 
     return readArray(loader); 

    case VAL_INTARRAY: 
     return createIntArray(); 

    case VAL_LONGARRAY: 
     return createLongArray(); 

    case VAL_BYTE: 
     return readByte(); 

    case VAL_SERIALIZABLE: 
     return readSerializable(loader); 

    case VAL_PARCELABLEARRAY: 
     return readParcelableArray(loader); 

    case VAL_SPARSEARRAY: 
     return readSparseArray(loader); 

    case VAL_SPARSEBOOLEANARRAY: 
     return readSparseBooleanArray(); 

    case VAL_BUNDLE: 
     return readBundle(loader); // loading will be deferred 

    case VAL_PERSISTABLEBUNDLE: 
     return readPersistableBundle(loader); 

    case VAL_SIZE: 
     return readSize(); 

    case VAL_SIZEF: 
     return readSizeF(); 

    default: 
     int off = dataPosition() - 4; 
     throw new RuntimeException(
      "Parcel " + this + ": Unmarshalling unknown type code " + type + " at offset " + off); 
    } 
} 

因此,這意味着,如果不知何故type沒有得到的情況下匹配,則代碼進入default。 另外我知道如果loader來到null,那麼代碼將進入默認值。

所以,這意味着在某種程度上readInt()在功能開始時,除了這些獲得價值,在同一個包裹類中聲明: -

private static final int VAL_NULL = -1; 
    private static final int VAL_STRING = 0; 
    private static final int VAL_INTEGER = 1; 
    private static final int VAL_MAP = 2; 
    private static final int VAL_BUNDLE = 3; 
    private static final int VAL_PARCELABLE = 4; 
    private static final int VAL_SHORT = 5; 
    private static final int VAL_LONG = 6; 
    private static final int VAL_FLOAT = 7; 
    private static final int VAL_DOUBLE = 8; 
    private static final int VAL_BOOLEAN = 9; 
    private static final int VAL_CHARSEQUENCE = 10; 
    private static final int VAL_LIST = 11; 
    private static final int VAL_SPARSEARRAY = 12; 
    private static final int VAL_BYTEARRAY = 13; 
    private static final int VAL_STRINGARRAY = 14; 
    private static final int VAL_IBINDER = 15; 
    private static final int VAL_PARCELABLEARRAY = 16; 
    private static final int VAL_OBJECTARRAY = 17; 
    private static final int VAL_INTARRAY = 18; 
    private static final int VAL_LONGARRAY = 19; 
    private static final int VAL_BYTE = 20; 
    private static final int VAL_SERIALIZABLE = 21; 
    private static final int VAL_SPARSEBOOLEANARRAY = 22; 
    private static final int VAL_BOOLEANARRAY = 23; 
    private static final int VAL_CHARSEQUENCEARRAY = 24; 
    private static final int VAL_PERSISTABLEBUNDLE = 25; 
    private static final int VAL_SIZE = 26; 
    private static final int VAL_SIZEF = 27; 

,並在我的情況30.這樣仍不清楚我,正如前面所問,如果xxxx的值與已聲明值相比如何確定,它是如何確定的?

+0

你解決了你的問題嗎?它是否只出現在6.x或以前的版本? –

+0

我刪除了proguard,並嘗試運行該應用程序,然後在這方面沒有錯誤。但我仍然找不到原因。此外,問題確實出現在版本爲6.x及以下的設備上。 – Mrigank

+0

嘿@ ab.helly,我已經解決了這個問題。它發生在對象的書寫順序和閱讀順序不同時。假設,我們正在寫一個對象,例如ABC格式,我們正在以ACB格式讀取對象,所以出現這種錯誤。所以請確保文件和閱讀的順序是相同的。 – Mrigank

回答

2

檢查你的解析序列,或者你可以使用android studio插件。https://plugins.jetbrains.com/plugin/7332?pr=

+0

謝謝,是的,我發現該解決方案通過檢查序列,感謝您的意見。 – Mrigank

+0

我使用上面列出的插件,但由於Parcelable列表和繼承的問題,遇到了同樣的錯誤。如果要保存應用程序中其他類中擴展類的對象列表,則可能會遇到此問題。你可以在這裏找到一篇關於這個問題的更長的文章(https:// medium。COM/@ kcoppock /寫-parcelable-名單,與繼承,a739c42c055c) – audiophile121