我已經收到此錯誤: -解組類型代碼和偏移值及其含義?
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
它接受ClassLoader
類loader
對象拋出。
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的值與已聲明值相比如何確定,它是如何確定的?
你解決了你的問題嗎?它是否只出現在6.x或以前的版本? –
我刪除了proguard,並嘗試運行該應用程序,然後在這方面沒有錯誤。但我仍然找不到原因。此外,問題確實出現在版本爲6.x及以下的設備上。 – Mrigank
嘿@ ab.helly,我已經解決了這個問題。它發生在對象的書寫順序和閱讀順序不同時。假設,我們正在寫一個對象,例如ABC格式,我們正在以ACB格式讀取對象,所以出現這種錯誤。所以請確保文件和閱讀的順序是相同的。 – Mrigank