解组类型代码和偏移值及其含义?

时间:2015-12-18 10:11:32

标签: android unmarshalling parcelable

我收到了这个错误: -

java.lang.RuntimeException: Parcel android.os.Parcel@41a2f780: Unmarshalling unknown type code 30 at offset 8804

即使我在我的Android应用中完成了此解决方案:https://stackoverflow.com/a/21380449/2492278

这可能是一个重复的问题,但我已经通过各种解决方案提出:

1。)更改proguard conf文件。

2.)检查对相同数据类型执行读写解析操作。

来自各种线程的许多其他解决方案,但这并不能解决我的问题。

主要是,有没有人知道未知类型代码xxxx和偏移yyyy的含义。我的意思是这两个值到底意味着什么?

更新: -

我正在滚动代码,我发现此异常基本上是从属于readValue()的{​​{1}}函数抛出的,该函数接受android.os.Parcel类的loader对象。

ClassLoader

所以这意味着,如果在某些情况下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来自 null ,那么代码将进入默认值。

所以,这意味着函数开头的某种方式loader与它们相区别,在同一个Parcel类中声明: -

readInt()

在我的情况下30.所以我仍然不清楚,如前所述,如果xxxx除了声明的值之外是如何确定的呢?

1 个答案:

答案 0 :(得分:2)

检查你的解析顺序,或者你可以使用android studio plug in。https://plugins.jetbrains.com/plugin/7332?pr=