「BadParcelableException: アンマーシャリング時にClassNotFoundExceptionが発生しました 「ClassLoaderを引数として持つParcel.readメソッドを使用しているときに質問する

「BadParcelableException: アンマーシャリング時にClassNotFoundExceptionが発生しました 「ClassLoaderを引数として持つParcel.readメソッドを使用しているときに質問する

カスタムクラスが与えられたので、 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に感謝しますヒントそれは私を正しい道へと導いてくれました。

おすすめ記事