Android Parcelable 问题 - 解组时出现 ClassNotFoundException
Android Parcelable Issue - ClassNotFoundException when Unmarshalling
我有一个对象列表如下:
data class MyProduct(
var id: String?,
var name: String?
) : Parcelable {
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(id)
parcel.writeString(name)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MyProduct> {
override fun createFromParcel(parcel: Parcel) = MyProduct(
id = parcel.readString(),
name = parcel.readString(),
)
override fun newArray(size: Int): Array<MyProduct?> = arrayOfNulls(size)
}
}
MutableList<MyProduct>
我需要使用活动广播来分享这个。我有一个方法如下:
fun sendMyProduct(myProducts: MutableList<MyProduct>) {
intentBroadcaster.broadcastMessage(
event = EVENT_MY_PRODUCTS,
data = MyProductsUpdated(
myProducts = myProducts
)
)
}
MyProductsUpdated
是可打包的 class.
data class MyProductsUpdated(
val myProducts: MutableList<MyProduct>
) : Event {
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeList(myProducts)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MyProductsUpdated> {
override fun createFromParcel(parcel: Parcel) = MyProductsUpdated(
myProducts = parcel.readParcelable(MyProduct::class.java.classLoader)!!
)
override fun newArray(size: Int): Array<MyProductsUpdated?> = arrayOfNulls(size)
}
}
当我需要在广播后检索数据时,我正在执行以下操作:
private fun myProductsUpdated(action: String, extras: Bundle) = invokeCallbacks(action) {
extras.getParcelable<MyProductsUpdated>(Events.DATA)!!
}
我不完全相信我将列表作为 parcelable 读取或写入的处理是正确的。
在我尝试使用它的那一刻,我遇到了以下崩溃:
java.lang.RuntimeException: Error receiving broadcast Intent
即:
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ��9
at android.os.Parcel.readParcelableCreator(Parcel.java:2556)
at android.os.Parcel.readParcelable(Parcel.java:2482)
at com.xx.services.MyProductUpdated$CREATOR.createFromParcel(MyProductsUpdated.kt:26)
at com.xx.services.events.MyProductsUpdated$CREATOR.createFromParcel(MyProductsUpdated.kt:24)
我认为这个问题与我正在写一个 'list' 但只是阅读一个 parcelable 但我不太确定如何解决这个问题有关。任何帮助将不胜感激。
您应该使用 readList
,而不是 readParcelable
。将内容读入现有列表。
myProducts = mutableListOf<MyProduct>().apply {
parcel.readList(this, MyProduct::class.java.classLoader)
}
也可以考虑使用 the Parcelize plugin 来节省一些时间。
我有一个对象列表如下:
data class MyProduct(
var id: String?,
var name: String?
) : Parcelable {
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(id)
parcel.writeString(name)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MyProduct> {
override fun createFromParcel(parcel: Parcel) = MyProduct(
id = parcel.readString(),
name = parcel.readString(),
)
override fun newArray(size: Int): Array<MyProduct?> = arrayOfNulls(size)
}
}
MutableList<MyProduct>
我需要使用活动广播来分享这个。我有一个方法如下:
fun sendMyProduct(myProducts: MutableList<MyProduct>) {
intentBroadcaster.broadcastMessage(
event = EVENT_MY_PRODUCTS,
data = MyProductsUpdated(
myProducts = myProducts
)
)
}
MyProductsUpdated
是可打包的 class.
data class MyProductsUpdated(
val myProducts: MutableList<MyProduct>
) : Event {
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeList(myProducts)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MyProductsUpdated> {
override fun createFromParcel(parcel: Parcel) = MyProductsUpdated(
myProducts = parcel.readParcelable(MyProduct::class.java.classLoader)!!
)
override fun newArray(size: Int): Array<MyProductsUpdated?> = arrayOfNulls(size)
}
}
当我需要在广播后检索数据时,我正在执行以下操作:
private fun myProductsUpdated(action: String, extras: Bundle) = invokeCallbacks(action) {
extras.getParcelable<MyProductsUpdated>(Events.DATA)!!
}
我不完全相信我将列表作为 parcelable 读取或写入的处理是正确的。
在我尝试使用它的那一刻,我遇到了以下崩溃:
java.lang.RuntimeException: Error receiving broadcast Intent
即:
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ��9
at android.os.Parcel.readParcelableCreator(Parcel.java:2556)
at android.os.Parcel.readParcelable(Parcel.java:2482)
at com.xx.services.MyProductUpdated$CREATOR.createFromParcel(MyProductsUpdated.kt:26)
at com.xx.services.events.MyProductsUpdated$CREATOR.createFromParcel(MyProductsUpdated.kt:24)
我认为这个问题与我正在写一个 'list' 但只是阅读一个 parcelable 但我不太确定如何解决这个问题有关。任何帮助将不胜感激。
您应该使用 readList
,而不是 readParcelable
。将内容读入现有列表。
myProducts = mutableListOf<MyProduct>().apply {
parcel.readList(this, MyProduct::class.java.classLoader)
}
也可以考虑使用 the Parcelize plugin 来节省一些时间。