Сериализатор для класса данных Kotlin не найден в выпуске сборки

Я хочу преобразовать свой ответ строки json из API в объект:

val obj = Json.decodeFromString<MyModel>(jsonResponseString)

Мой класс данных:

@Serializable
data class MyModel(
    @SerializedName("field") val field: String
)

Это выглядит очень просто и работает в режиме отладки!

Но когда я скомпилировал AppBundle, построил в режиме выпуска и загрузил приложение из Play Store для внутреннего тестирования, я получил следующую ошибку:

Serializer for class '...' is not found. Mark the class as @serializable or provide the 
serializer explicitly.
kotlinx.serialization.internal.Platform_commonKt.serializerNotRegistered
11
0
5 737
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я нашел следующее решение:

Первым шагом я добавил аннотацию @Keep. Сохранить аннотацию означает, что аннотированный элемент не следует удалять при минимизации кода во время сборки:

@Keep
@Serializable
data class MyModel(
    @SerializedName("field") val field: String
)

Второй шаг, я преобразовал свой json в объект, создав статическую ссылку на сериализатор:

val objError = Json {ignoreUnknownKeys = true}.decodeFromString(MyModel.serializer(), jsonResponseString)

Не забудьте импортировать и внедрить последнюю версию:

'org.jetbrains.kotlin.plugin.serialization'

И это сработало, и это спасло мой день!!

Вы спасли день!

Mervin Hemaraju 30.01.2023 19:13

Вы должны добавить это в свой proguard.pro, если используете minifyEnabled true

-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations

# kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer
-keepclassmembers class kotlinx.serialization.json.** {
    *** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
    kotlinx.serialization.KSerializer serializer(...);
}

# Change here com.yourcompany.yourpackage
-keep,includedescriptorclasses class com.yourcompany.yourpackage.**$$serializer { *; } # <-- change package name to your app's
-keepclassmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's
    *** Companion;
}
-keepclasseswithmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's
    kotlinx.serialization.KSerializer serializer(...);
}

Убедитесь, что вы заменили имя пакета-заполнителя именем пакета вашего приложения.

Источник

Я исправил это с этими изменениями в файлах Gradle, в Gradle проекта сборки добавьте эту строку в зависимости:

classpath "org.jetbrains.kotlin:kotlin-serialization:1.5.21"

Добавьте также это в градиент приложения сборки:

plugins {
    ...
    id 'kotlinx-serialization'
}
dependencies {
    ...
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2'
}

Обратите внимание, что номера версий могут отличаться.

Начиная с версии 1.5.0-RC правила proguard поставляются с библиотекой.

Связанные правила Proguard JAR-файл kotlinx-serialization-core-jvm теперь включает потребительские правила Proguard >rules, поэтому ручная настройка Proguard больше не требуется для большинства настроек.

Другие вопросы по теме