E / Parcel: класс не найден при отмене сортировки в классе @Parcelize - PullRequest
1 голос
/ 19 февраля 2020

поэтому я получил Retrofit API + Gson в качестве конвертера, и у меня есть класс parcelable для перехода к различным действиям ...

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

Вот обобщенный c класс списка, который может быть обработан следующим образом:

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()

Как только я хочу разложить эти классы, происходит сбой с , вызванным: android .os.BadParcelableException: ClassNotFoundException при отмене сортировки

Каким может быть решение?

1 Ответ

0 голосов
/ 21 февраля 2020

Проблема может заключаться в аннотации @RawValue.

Из javado c:

Запишите соответствующее значение свойства с помощью [android .os.Parcel. WriteValue]. Сериализация может завершиться с ошибкой во время выполнения, в зависимости от фактического типа значения свойства.

Возможно, возникнут некоторые проблемы с сериализацией обобщенного c типа T. Это все, что я могу догадаться без дополнительной информации о том, какой класс не мог ' не найти.

Я бы посоветовал вам избегать использования этой аннотации и использовать общие параметры компилятора, например:

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

Я также могу предложить, если это возможно, сделать AbsPlot интерфейс и пометить как Parcelable каждую из реализаций интерфейса.

Другая вещь, которая заставляет меня сомневаться, это проверить, является ли класс Ratings Parcelable.

...