5

我想将我的 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
4

4 回答 4

8

如果你正在使用,你应该把它添加到你的 proguard.prominifyEnabled 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(...);
}

确保将占位符包名称替换为您的应用包名称

资源

于 2021-02-06T14:13:03.720 回答
5

我找到了下一个解决方案:

第一步,我添加了@Keep注解。Keep annotation 表示在构建时缩小代码时不应删除带注释的元素:

@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'

它奏效了,它拯救了我的一天!

于 2020-12-24T20:38:24.293 回答
0

我已经修复了 Gradle 文件中的这些更改,在构建项目 gradle 中将此行添加到依赖项:

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

还将这些添加到构建应用程序 gradle 中:

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

请注意版本号可能不同。

于 2021-08-29T04:08:15.347 回答
-1

我遇到了同样的问题,出于一个奇怪的原因,将我的 val 参数更改为 var 修复了它。我希望它也适合你。

于 2021-08-19T20:36:22.187 回答