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
.
所以我得到了 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
.