使用具有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()); 

希望这会对一些人有所帮助。