Flow Flow - 1 year ago 117
Android Question

"BadParcelableException: ClassNotFoundException when unmarshalling <myclass>" while using Parcel.read method that has a ClassLoader as argument

Given a custom class

org.example.app.MyClass implements Parcelable
, I want to write a
to a Parcel. I did the marshalling with

List<MyClass> myclassList = ...

whenever I try to unmarshall the class with

List<MyClass> myclassList = new ArrayList<MyClass>();
parcel.readList(myclassList, null);

there is an
"BadParcelableException: ClassNotFoundException when unmarshalling org.example.app.MyClass"

What is wrong here? Why is the class not found?

Answer Source

Don't unmarshall a custom class, i.e. one provided by your application and not by the Android framework, with the framework class loader that get's used when you give null as Classloader argument. Use the application class loader:

parcel.readList(myclassList, getClass().getClassLoader());

Whenever a Parcel.read*() method also has a ClassLoader as argument (e.g. Parcel.readList(List outVal, ClassLoader loader)) and you want to read a application class from a Parcel, use the application class loader that can be retrieved with getClass().getClassLoader().

Background: Android comes with two class loaders: The system class loader, that is able to load all system classes but the the ones provided by your application. And the application class loader, which has set the system class loader as parent and therefore is able to load all classes. If you give null a class loader, Parcel.readParcelableCreator(), will use the framework class loader, causing in the ClassNotFoundException.

Thanks to alexanderblom for providing the hint that lead me on the right track