E/Parcel:使用@Parcelize 解组 class 时未找到 Class

E/Parcel: Class not found when unmarshalling class with @Parcelize

所以我得到了 Retrofit API + Gson 作为转换器,我有 parcelable class 可以传递给各种活动...

@Parcelize
data class GenericList<T>(
    @SerializedName("data") var data: @RawValue List<T>
) : Parcelable

这是一个通用列表 class,可以通过以下方式打包:

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 时可能会遇到一些问题。这就是我所能猜测的全部内容,没有找到 class 找不到的更多详细信息。

我建议您避免使用该注释并像这样使用编译器泛型选项:

@Parcelize
data class GenericList<T : Parcelable>(
    @SerializedName("…") val data: List<T>
) : Parcelable

我可能还会建议,如果可能的话,使 AbsPlot 成为一个接口并将接口的每个实现标记为 Parcelable

另一件让我怀疑的事情是检查 class Ratings 是否是 Parcelable.