Class not found when unmarshalling:

一、问题描述及解决方式

问题描述:这个问题主要出在某些版本的手机上面使用了Intent直接传递Parcelable数据,且Parcelable类型是使用默认方式生成的。示例如下:

@Parcelize
data class FunctionResultBean(
    val isComplete: Boolean = false, //是否完成
    val completeDesc: String = "none", //完成结果的描述
): Parcelable

传递方式如下:

 fun launch(
            cxt: Context,
            desArray: ArrayList<FunctionResultBean> = arrayListOf()
        ) {
    
    
            val intent = Intent(cxt, PcmResultActivity::class.java)
            intent.putParcelableArrayListExtra(KEY_FUNCTION_SUB_DES_ARRAY, desArray)
            cxt.startActivity(intent)
        }

修改方式有多种,这里使用比较方便的一种,

 fun launch(
            cxt: Context,
            desArray: ArrayList<FunctionResultBean> = arrayListOf()
        ) {
    
    
            val intent = Intent(cxt, PcmResultActivity::class.java)
            val bundle = Bundle()
            bundle.putParcelableArrayList(KEY_FUNCTION_SUB_DES_ARRAY, desArray)
            intent.putExtra("KEY",bundle)
            cxt.startActivity(intent)
        }

还有一种方式是自己生成Parcelable类,不再使用默认的,自己生成时候替换默认加载器BootClassLoader为自己的类加载器,如下:

		mHashMap = in.readHashMap(HashMap.class.getClassLoader())
		# 修改如下
        mHashMap = in.readHashMap(TestBean.class.getClassLoader());


另外一种方式是在使用Intent传递数据时候添加加载器

intent.setExtrasClassLoader(ImagesSet::class.java.classLoader)

除此之外还可以转换成字节数组传递,该方式出现在Alarms.java

二、日志

Class not found when unmarshalling
com.speedclean.master.expert.function.finish.FunctionResultBean
java.lang.ClassNotFoundException: 
com.speedclean.master.expert.function.finish.FunctionResultBean                                    
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at android.os.Parcel.readParcelableCreator(Parcel.java:2827)
at android.os.Parcel.readParcelable(Parcel.java:2781)
at android.os.Parcel.readValue(Parcel.java:2684)
at android.os.Parcel.readListInternal(Parcel.java:3114)
at android.os.Parcel.readArrayList(Parcel.java:2335)
at android.os.Parcel.readValue(Parcel.java:2705)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288)
at android.os.BaseBundle.unparcel(BaseBundle.java:232)
at android.os.BaseBundle.getString(BaseBundle.java:1155)
at android.content.Intent.getStringExtra(Intent.java:8135)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:739)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:677)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1646)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:619)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6745)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6626)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6617)
at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10870)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:111)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4181)
at android.os.Binder.execTransact(Binder.java:739)
Caused by: java.lang.ClassNotFoundException: com.speedclean.master.expert.function.finish.FunctionResultBean
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at android.os.Parcel.readParcelableCreator(Parcel.java:2827) 
at android.os.Parcel.readParcelable(Parcel.java:2781) 
at android.os.Parcel.readValue(Parcel.java:2684) 
at android.os.Parcel.readListInternal(Parcel.java:3114)
at android.os.Parcel.readArrayList(Parcel.java:2335) 
at android.os.Parcel.readValue(Parcel.java:2705)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3053)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:288) 
at android.os.BaseBundle.unparcel(BaseBundle.java:232) 
at android.os.BaseBundle.getString(BaseBundle.java:1155)
at android.content.Intent.getStringExtra(Intent.java:8135) 
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:739) 
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:677) 
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1646)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:619) 
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6745) 
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:6626)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:6617) 
at android.app.IActivityManager$Stub.onTransact$startActivity$(IActivityManager.java:10870) 
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:111) 
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4181) 
at android.os.Binder.execTransact(Binder.java:739)
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

三、参考链接

  1. 使用Parcelable时出现Class not found when unmarshalling问题
  2. Class not found when unmarshalling: com.xx.xx.bean.ImagesSet
  3. Parcel: Class not found when unmarshalling: 自定义类

猜你喜欢

转载自blog.csdn.net/Mr_Tony/article/details/129929146
今日推荐