BadParcelableException:解组时的ClassNotFoundException :(空类名)

时间:2012-05-11 13:12:49

标签: android classnotfoundexception parcelable parcel

我有一个名为AllStatStruct的类。该类包含三个属性,它们是我的类StatStructCycle,StatStructHistory和MatrixStruct的对象。每个类都扩展了DataStruct类并实现了Parcelable接口。在接口的实现中,使用readParceable()writeParceable()来读取和写入每个类。

在我的Activity中,我在AsyncTask中调用SOAP Web服务并获取类AllStatStruct的对象。通过创建Bundle

将此对象传递给下一个Activity
protected void onPostExecute(final AllStatStruct ass) {

    if (ass != null) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        Bundle bundle = new Bundle();
        bundle.putParcelable("allStatStruct", ass);
        intent = new Intent(packageContext, PrivateView.class);
        intent.putExtras(bundle);
        startActivity(intent);

    } else {
        KreativBarometerMainView.this.showDialog(9999);
    }
}

编组包裹效果很好,正如我在LogCat中的跟踪输出中看到的那样。但是当解组parcel时,会发生ClassNotFoundException并且我不知道为什么。这是跟踪:

05-11 15:02:59.796: E/AndroidRuntime(8647): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readParcelable(Parcel.java:1958)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.net.structs.AllStatStruct.<init>(AllStatStruct.java:45)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.net.structs.AllStatStruct$1.createFromParcel(AllStatStruct.java:70)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.net.structs.AllStatStruct$1.createFromParcel(AllStatStruct.java:1)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readParcelable(Parcel.java:1981)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readValue(Parcel.java:1846)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Parcel.readMapInternal(Parcel.java:2083)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Bundle.unparcel(Bundle.java:208)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.os.Bundle.getParcelable(Bundle.java:1100)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at de.kreativBarometer.ui.PrivateView.onCreate(PrivateView.java:693)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-11 15:02:59.796: E/AndroidRuntime(8647):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628)
05-11 15:02:59.796: E/AndroidRuntime(8647):     ... 11 more

正如您所看到的,没有找到未找到的课程的名称!所以它正在搜索名为“”的类,当然找不到它。

我不知道为什么会这样。有人能帮我吗?我已经尝试过使用ClassLoader了,但是给了意图一个额外的类加载器并使用这个来解组parcelables不起作用。

修改

正如你的建议,我试图单独传递AllStatStruct的几个部分。它适用于StatStructCycleMatrixStruct,但使用StatStructHistory时,仍会出现错误。

现在,当我尝试在其中使用NullPointerException解组我的ArrayList时,我得到StatStructCycle。我评论了历史的其他部分。

我尝试使用writeTypedList(List<T> list)readTypedList(List<T> list, Creator<T> c)编写和读取ArrayList,但它也无效。

当我使用ArrayLists时,我还使用trimToSize()将其容量调整为实际大小,因为我认为ArrayList的“空”插槽可能会导致问题。但同样,情况并非如此......

使用调试器启动应用程序显示,已编组的StatStructHistory没有空值...每个属性或列表项都已初始化。我不知道NullPointerException来自哪里。

最好的问候 HTZ

1 个答案:

答案 0 :(得分:0)

Problem unmarshalling parcelables

即使您的编组成功,看起来如果存在空例外,则解组过程仍可能失败。

出于调试目的,请尝试逐个编组每个子对象。看看是否有任何错误,然后深入研究问题。现在你正在尝试同时解决3个对象,并且很难确定哪一个有问题(如果有的话)。

如果不清楚,我建议尝试这个:

bundle.putParcelable("allStatStruct", ass.StatStructCycle); 

如果有效,请尝试:

bundle.putParcelable("allStatStruct", ass.StatStructHistory); 

等...