所以我得到了 Retrofit API + Gson 作为转换器,我有 parcelable 类可以传递给各种 Activity ......
@Parcelize
data class GenericList<T>(
@SerializedName("data") var data: @RawValue List<T>
) : Parcelable
这是一个通用列表类,可与以下内容打包:
abstract class AbsPlot : Parcelable {
abstract var rating: Map<String, Rating>?
abstract var plots: GenericList<Plot>?
....
abstract var languages: GenericList<Language>?
}
@Parcelize
data class Plot(
@SerializedName("rating") override var rating: Map<String, Rating>?,
@SerializedName("plots") override var plots: GenericList<Plot>?,
....
@SerializedName("languages") override var languages: GenericList<Language>?,
) : AbsPlot()
一旦我想取消包裹这些类(class),它就会崩溃
引起:android.os.BadParcelableException: 解码时 ClassNotFoundException
有什么办法可以解决?
最佳答案
问题可能是 @RawValue
注解。
从它的javadoc:
Write the corresponding property value with [android.os.Parcel.writeValue]. Serialization may fail at runtime, depending on actual property value type.
序列化泛型类型 T 可能会遇到一些问题。如果没有更多关于找不到哪个类的详细信息,我只能猜到这些。
我建议您避免使用该注释并使用编译器泛型选项,如下所示:
@Parcelize
data class GenericList<T : Parcelable>(
@SerializedName("…") val data: List<T>
) : Parcelable
如果可能的话,我还建议制作
AbsPlot
一个接口(interface)并标记为Parcelable
接口(interface)的每个实现。让我怀疑的另一件事是检查类
Ratings
是 Parcelable
.
关于android - 电子/包裹 : Class not found when unmarshalling class with @Parcelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60289647/