微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在构建版本中找不到数据类 Kotlin 的序列化程序

如何解决在构建版本中找不到数据类 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

解决方法

如果您使用的是 minifyEnabled true

,您应该将它添加到您的 proguard.pro
-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(...);
}

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

Source

,

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

第一步,我添加了@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'

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。