android - 电子/包裹 : Class not found when unmarshalling class with @Parcelize

标签 android kotlin parcelable

所以我得到了 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)的每个实现。

让我怀疑的另一件事是检查类 RatingsParcelable .

关于android - 电子/包裹 : Class not found when unmarshalling class with @Parcelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60289647/

相关文章:

android - java.lang.NoClassDefFoundError : android/test/ActivityInstrumentationTestCase2 错误

Android如何以水平方向更线性布局全屏

android - 在RecyclerView中获取后从 fragment 传输数据时如何更改 fragment 的内容?

android - 如何在 kotlin @Parcelize 中使用 null

android - 如何永久存储可打包的自定义对象?

android - 在真实设备上振动多次以在android中通知(接近警报)

java - Android 文本中的笔划问题

Spring(kotlin) Controller 接收数据类的不可为空的参数为空

firebase - 如何从 Firebase 数据库中检索数据并将其存储在 ListArray<Class> 中? - Kotlin

android - 任务 ':app:kaptDebugKotlin' 执行失败。清理构建时