java - Parcelable 对象错误 : Unmarshalling unknown type code *** at offset ***

标签 java android oop unmarshalling parcelable

我正在尝试为学校完成这个项目,但我的 Parcelable 代码的“读取”部分不断收到此错误。这占用了我一天中的很多时间,我读过无数有类似问题的 StackOverflow 页面,但这些解决方案都不适合我。

以下是我读过的内容,但似乎不是问题所在:

  1. Proguard(因为我没有使用)
  2. Android Studio 已更新
  3. “读取”和“写入”类型不匹配
  4. “读取”和“写入”部分中对象参数的顺序

抛出错误的行:

this.quantity = ((float) in.readValue((float.class.getClassLoader())));

这是自定义类:

public class Ingredient implements Parcelable {

@SerializedName("quantity")
@Expose
private float quantity;
@SerializedName("measure")
@Expose
private String measure;
@SerializedName("ingredient")
@Expose
private String ingredient;

private Ingredient(Parcel in) {
    this.quantity = ((float) in.readValue((float.class.getClassLoader())));
    this.measure = ((String) in.readValue((String.class.getClassLoader())));
    this.ingredient = ((String) in.readValue((String.class.getClassLoader())));
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeValue(quantity);
    dest.writeValue(measure);
    dest.writeValue(ingredient);
}
/**
 * No args constructor for use in serialization
 */
@SuppressWarnings("unused")
public Ingredient() {
}

/**
 * @param measure
 * @param ingredient
 * @param quantity
 */
@SuppressWarnings("JavaDoc")
public Ingredient(float quantity, String measure, String ingredient) {
    super();
    this.quantity = quantity;
    this.measure = measure;
    this.ingredient = ingredient;
}

public static final Creator<Ingredient> CREATOR = new Creator<Ingredient>() {
    @Override
    public Ingredient createFromParcel(Parcel in) {
        return new Ingredient(in);
    }

    @Override
    public Ingredient[] newArray(int size) {
        return new Ingredient[size];
    }
};

public float getQuantity() {
    return quantity;
}

public String getMeasure() {
    return measure;
}

public String getIngredient() {
    return ingredient;
}

public int describeContents() {
    return 0;
}

这是堆栈跟踪:

java.lang.RuntimeException: Unable to start activityComponentInfo{com.joelcamargo.mybakingapp/com.joelcamargo.mybakingapp.FragmentActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@b8940f5: Unmarshalling unknown type code 7077996 at offset 144
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
                                                                           at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
                                                                        Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@b8940f5: Unmarshalling unknown type code 7077996 at offset 144
                                                                           at android.os.Parcel.readValue(Parcel.java:2443)
                                                                           at com.joelcamargo.mybakingapp.model.Ingredient.<init>(Ingredient.java:22)
                                                                           at com.joelcamargo.mybakingapp.model.Ingredient.<init>(Ingredient.java:0)
                                                                           at com.joelcamargo.mybakingapp.model.Ingredient$1.createFromParcel(Ingredient.java:55)
                                                                           at com.joelcamargo.mybakingapp.model.Ingredient$1.createFromParcel(Ingredient.java:52)
                                                                           at android.os.Parcel.createTypedArrayList(Parcel.java:2107)
                                                                           at com.joelcamargo.mybakingapp.model.Recipe.<init>(Recipe.java:58)
                                                                           at com.joelcamargo.mybakingapp.model.Recipe.<init>(Recipe.java:0)
                                                                           at com.joelcamargo.mybakingapp.model.Recipe$1.createFromParcel(Recipe.java:71)
                                                                           at com.joelcamargo.mybakingapp.model.Recipe$1.createFromParcel(Recipe.java:68)
                                                                           at android.os.Parcel.readParcelable(Parcel.java:2470)
                                                                           at android.os.Parcel.readValue(Parcel.java:2364)
                                                                           at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
                                                                           at android.os.BaseBundle.unparcel(BaseBundle.java:269)
                                                                           at android.os.Bundle.getParcelable(Bundle.java:840)
                                                                           at com.joelcamargo.mybakingapp.FragmentActivity.onCreate(FragmentActivity.java:90)
                                                                           at android.app.Activity.performCreate(Activity.java:6662)
                                                                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)

任何帮助将不胜感激!

编辑1:

我根据下面 Ben 的回复更新了我的代码。我在堆栈跟踪中收到一条新的错误消息,并且我得到了一个数组大小为“7667790”的数组,该数组应该约为“12”。

新的堆栈跟踪:

    JNI ERROR (app bug): weak global reference table overflow (max=51200)
    A/art: art/runtime/indirect_reference_table.cc:116] weak global reference table dump:
    A/art: art/runtime/indirect_reference_table.cc:116]   Last 10 entries (of 51200):
    A/art: art/runtime/indirect_reference_table.cc:116]     51199: 0x1b0d2c40 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51198: 0x1b0d2b68 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51197: 0x1b0d2ac0 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51196: 0x1b0d29d0 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51195: 0x1b0d28f8 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51194: 0x1b0d2850 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51193: 0x1b0d2760 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51192: 0x1b0d2688 android.view.RenderNode
    A/art: art/runtime/indirect_reference_table.cc:116]     51191: 0x1b0d25e0 android.view.RenderNode
A/art: art/runtime/indirect_reference_table.cc:116]     51190: 0x1b0d24f0 android.view.RenderNode
A/art: art/runtime/indirect_reference_table.cc:116]   Summary:
A/art: art/runtime/indirect_reference_table.cc:116]         1 of java.lang.Thread
A/art: art/runtime/indirect_reference_table.cc:116]         3 of byte[] (1152 elements) (3 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         3 of byte[] (3828 elements) (3 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         1 of byte[] (5376 elements)
A/art: art/runtime/indirect_reference_table.cc:116]         5 of byte[] (7056 elements) (5 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         4 of byte[] (7844 elements) (4 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         1 of byte[] (13356 elements)
A/art: art/runtime/indirect_reference_table.cc:116]         9 of byte[] (15876 elements) (9 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]        27 of byte[] (20164 elements) (27 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         2 of byte[] (26896 elements) (2 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         2 of byte[] (26912 elements) (2 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]        14 of byte[] (28224 elements) (14 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         3 of byte[] (36100 elements) (3 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         2 of byte[] (36288 elements) (2 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         3 of byte[] (60984 elements) (3 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         3 of byte[] (63504 elements) (3 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         4 of byte[] (82792 elements) (4 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         5 of byte[] (206116 elements) (5 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]        26 of java.lang.DexCache (26 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]         2 of dalvik.system.PathClassLoader (1 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116]     51080 of android.view.RenderNode (51080 unique instances)
A/art: art/runtime/indirect_reference_table.cc:116] 
A/art: art/runtime/runtime.cc:403] Runtime aborting...
A/art: art/runtime/runtime.cc:403] Aborting thread:
A/art: art/runtime/runtime.cc:403] "main" prio=5 tid=1 Runnable
A/art: art/runtime/runtime.cc:403]   | group="" sCount=0 dsCount=0 obj=0x73fe7268 self=0xa990b400
A/art: art/runtime/runtime.cc:403]   | sysTid=18360 nice=0 cgrp=default sched=0/0 handle=0xadc3e534
A/art: art/runtime/runtime.cc:403]   | state=R schedstat=( 0 0 0 ) utm=1662 stm=110 core=0 HZ=100
A/art: art/runtime/runtime.cc:403]   | stack=0xbf73e000-0xbf740000 stackSize=8MB
A/art: art/runtime/runtime.cc:403]   | held mutexes= "abort lock" "JNI weak global reference table lock" "mutator lock"(shared held)
A/art: art/runtime/runtime.cc:403]   native: #00 pc 0056d8de  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+238)
A/art: art/runtime/runtime.cc:403]   native: #01 pc 00539f6e  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+526)
A/art: art/runtime/runtime.cc:403]   native: #02 pc 00536f6b  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+75)
A/art: art/runtime/runtime.cc:403]   native: #03 pc 00522d43  /system/lib/libart.so (_ZNK3art10AbortState10DumpThreadERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPNS_6ThreadE+67)
A/art: art/runtime/runtime.cc:403]   native: #04 pc 005229fa  /system/lib/libart.so (_ZNK3art10AbortState4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+330)
A/art: art/runtime/runtime.cc:403]   native: #05 pc 0051327b  /system/lib/libart.so (_ZN3art7Runtime5AbortEv+155)
A/art: art/runtime/runtime.cc:403]   native: #06 pc 00119572  /system/lib/libart.so (_ZN3art10LogMessageD1Ev+1298)
A/art: art/runtime/runtime.cc:403]   native: #07 pc 002ca6c8  /system/lib/libart.so (_ZN3art22IndirectReferenceTable3AddEjPNS_6mirror6ObjectE+376)
A/art: art/runtime/runtime.cc:403]   native: #08 pc 0038f68b  /system/lib/libart.so (_ZN3art9JavaVMExt16AddWeakGlobalRefEPNS_6ThreadEPNS_6mirror6ObjectE+91)
A/art: art/runtime/runtime.cc:403]   native: #09 pc 003ffc34  /system/lib/libart.so (_ZN3art3JNI16NewWeakGlobalRefEP7_JNIEnvP8_jobject+788)
A/art: art/runtime/runtime.cc:403]   native: #10 pc 0013e912  /system/lib/libart.so (_ZN3art8CheckJNI6NewRefEPKcP7_JNIEnvP8_jobjectNS_15IndirectRefKindE+1106)
A/art: art/runtime/runtime.cc:403]   native: #11 pc 00138689  /system/lib/libart.so (_ZN3art8CheckJNI16NewWeakGlobalRefEP7_JNIEnvP8_jobject+57)
A/art: art/runtime/runtime.cc:403]   native: #12 pc 000c0927  /system/lib/libandroid_runtime.so (???)
A/art: art/runtime/runtime.cc:403]   native: #13 pc 00acfd7c  /system/framework/x86/boot-framework.oat (Java_android_view_RenderNode_nCreate__Ljava_lang_String_2+136)
A/art: art/runtime/runtime.cc:403]   at android.view.RenderNode.nCreate(Native method)
A/art: art/runtime/runtime.cc:403]   at android.view.RenderNode.<init>(RenderNode.java:137)
A/art: art/runtime/runtime.cc:403]   at android.view.RenderNode.create(RenderNode.java:161)
A/art: art/runtime/runtime.cc:403]   at android.view.View.<init>(View.java:4005)
A/art: art/runtime/runtime.cc:403]   at android.view.View.<init>(View.java:4119)
A/art: art/runtime/runtime.cc:403]   at android.view.ViewGroup.<init>(ViewGroup.java:578)
A/art: art/runtime/runtime.cc:403]   at android.widget.RelativeLayout.<init>(RelativeLayout.java:248)
A/art: art/runtime/runtime.cc:403]   at android.widget.RelativeLayout.<init>(RelativeLayout.java:244)
A/art: art/runtime/runtime.cc:403]   at android.widget.RelativeLayout.<init>(RelativeLayout.java:240)
A/art: art/runtime/runtime.cc:403]   at java.lang.reflect.Constructor.newInstance0!(Native method)
A/art: art/runtime/runtime.cc:403]   at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
A/art: art/runtime/runtime.cc:403]   at android.view.LayoutInflater.createView(LayoutInflater.java:645)
A/art: art/runtime/runtime.cc:403]   at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
A/art: art/runtime/runtime.cc:403]   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:717)
A/art: art/runtime/runtime.cc:403]   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:785)
A/art: art/runtime/runtime.cc:403]   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
A/art: art/runtime/runtime.cc:403]   at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
A/art: art/runtime/runtime.cc:403]   - locked <0x0a6354e2> (a java.lang.Object[])
A/art: art/runtime/runtime.cc:403]   at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
A/art: art/runtime/runtime.cc:403]   at com.diegodobelo.expandingview.ExpandingItem.createSubItem(ExpandingItem.java:457)
A/art: art/runtime/runtime.cc:403]   at com.diegodobelo.expandingview.ExpandingItem.createSubItem(ExpandingItem.java:436)
A/art: art/runtime/runtime.cc:403]   at com.diegodobelo.expandingview.ExpandingItem.createSubItems(ExpandingItem.java:488)
A/art: art/runtime/runtime.cc:403]   at com.joelcamargo.mybakingapp.FragmentActivity.updateInfoViews(FragmentActivity.java:183)
A/art: art/runtime/runtime.cc:403]   at com.joelcamargo.mybakingapp.FragmentActivity.onCreate(FragmentActivity.java:109)
A/art: art/runtime/runtime.cc:403]   at android.app.Activity.performCreate(Activity.java:6662)
A/art: art/runtime/runtime.cc:403]   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
A/art: art/runtime/runtime.cc:403]   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
A/art: art/runtime/runtime.cc:403]   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
A/art: art/runtime/runtime.cc:403]   at android.app.ActivityThread.-wrap12(ActivityThread.java:-1)
A/art: art/runtime/runtime.cc:403]   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
A/art: art/runtime/runtime.cc:403]   at android.os.Handler.dispatchMessage(Handler.java:102)
A/art: art/runtime/runtime.cc:403]   at android.os.Looper.loop(Looper.java:154)
A/art: art/runtime/runtime.cc:403]   at android.app.ActivityThread.main(ActivityThread.java:6077)
A/art: art/runtime/runtime.cc:403]   at java.lang.reflect.Method.invoke!(Native method)
A/art: art/runtime/runtime.cc:403]   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
A/art: art/runtime/runtime.cc:403]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
A/art: art/runtime/runtime.cc:403] Dumping all threads without appropriate locks held: thread list lock

最佳答案

我不完全确定您为什么会收到该错误,但我知道您可以通过更改 Parcelable 实现以使用更具体的方法来解决该问题:

private Ingredient(Parcel in) {
    this.quantity = in.readFloat();
    this.measure = in.readString();
    this.ingredient = in.readString();
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeFloat(quantity);
    dest.writeString(measure);
    dest.writeString(ingredient);
}

如果可以的话,您应该始终尽量避免 writeValue()。对于像floatString这样的简单类型,有专门的读/写方法直接支持它们,不需要担心类加载器。

关于java - Parcelable 对象错误 : Unmarshalling unknown type code *** at offset ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48980541/

相关文章:

java - 如何以多线程方式从 rpt 生成 PDF 文档?

java - Maven 从包中运行所有测试

Java - ( Apache POI ) 在循环中设置单元格公式

Android Studio - 构建失败 '/home/node/Android/Sdk/build-tools/23.0.2/aapt' '以非零退出值 1 完成

android - Flutter 示例应用程序无法正常工作

javascript - 调用用变量标识的 jQuery 库函数

c# - 使用装饰器模式有条件地替换行为而不是扩展

java - 为什么不能将 Java 包命名为 "default"?

C# 3.0 隐式转换错误与泛型类和接口(interface)

java - 无法实例化类...;没有空的构造函数