使用具有ClassLoader作为参数的Parcel.read方法时,“BadParcelableException:解组时使用ClassNotFoundException”<unclassified> <myclass>
给定一个自定义的类org.example.app.MyClass implements Parcelable
,我想写一个List<MyClass>
到一个Parcel。 我做了编组
List<MyClass> myclassList = ... parcel.writeList(myclassList);
每当我试图解开class级
List<MyClass> myclassList = new ArrayList<MyClass>(); parcel.readList(myclassList, null);
"BadParcelableException: ClassNotFoundException when unmarshalling org.example.app.MyClass"
出现"BadParcelableException: ClassNotFoundException when unmarshalling org.example.app.MyClass"
exception。
这里有什么问题? 为什么没有findclass级?
不要解组一个自定义的类,也就是应用程序提供的而不是Android框架提供的类,当你给null
作为Classloader参数时,使用框架类加载器。 使用应用程序类加载器:
parcel.readList(myclassList, getClass().getClassLoader());
每当一个Parcel.read*()
方法也有一个ClassLoader作为参数(例如Parcel.readList(List outVal, ClassLoader loader)
)并且你想要从一个Parcel
读取一个应用程序类的时候,可以使用应用程序类加载器getClass().getClassLoader()
。
背景: Android自带两个类加载器:系统类加载器,它可以加载所有的系统类,但是应用程序提供的类。 而应用程序类加载器已经将系统类加载器设置为父类,因此能够加载所有的类。 如果给一个类加载器Parcel.readParcelableCreator()
, 将使用框架类加载器 ,导致ClassNotFoundException 。
感谢alexanderblom提供的提示 ,带领我走上正轨
我相信一个更正确的forms是:
List<MyClass> myclassList = new ArrayList<MyClass>(); parcel.readList(myclassList, MyClass.class.getClassLoader());
因为在这里你明确地使用List的generics类的类加载器。
我面临同样的问题,而不是parcleable我使用捆绑
intent.setExtrasClassLoader(getClassLoader()); /* Send optional extras */ Bundle bundle = new Bundle(); bundle.putParcelable("object", mObject); bundle.putString("stringVal", stringVal); intent.putExtra("bundle",bundle);
而在我的意图class,我用它来检索值:
Bundle oldBundle = intent.getBundleExtra("bundle"); ResultReceiver receiver = oldBundle.getParcelable("object"); String stringVal = oldBundle.getString("stringVal"); intent.setExtrasClassLoader(getClassLoader());
希望这会对一些人有所帮助。