カスタムクラスが与えられたので、 Parcelに をorg.example.app.MyClass implements Parcelable
書き込みたい。私は次のようにマーシャリングした。List<MyClass>
List<MyClass> myclassList = ...
parcel.writeList(myclassList);
クラスをアンマーシャルしようとするたびに
List<MyClass> myclassList = new ArrayList<MyClass>();
parcel.readList(myclassList, null);
例外があります"BadParcelableException: ClassNotFoundException when unmarshalling org.example.app.MyClass"
。
ここで何が問題なのでしょうか? クラスが見つからないのはなぜですか?
ベストアンサー1
ClassLoader 引数として指定したときに使用されるフレームワーク クラス ローダーを使用して、カスタム クラス (つまり、Android フレームワークではなくアプリケーションによって提供されるクラス) をアンマーシャリングしないでくださいnull
。アプリケーション クラス ローダーを使用します。
parcel.readList(myclassList, getClass().getClassLoader());
Parcel.read*()
メソッドが引数としてClassLoaderを持つ場合(例:Parcel.readList(List outVal, ClassLoader loader)
) で、 からアプリケーション クラスを読み取る場合はParcel
、 で取得できるアプリケーション クラス ローダーを使用しますgetClass().getClassLoader()
。
背景:Androidには2つのクラスローダーが付属しています。システムクラスローダーは、アプリケーションが提供するクラスを除くすべてのシステムクラスをロードできます。アプリケーションクラスローダーは、システムクラスローダーを親として設定しているため、すべてのクラスをロードできます。クラスローダーとしてnullを指定すると、Parcel.readParcelableCreator()
フレームワーククラスローダーを使用します、原因クラスが見つかりません。
提供してくれたalexanderblomに感謝しますヒントそれは私を正しい道へと導いてくれました。