在构建版本中找不到数据类 Kotlin 的序列化程序
Posted
技术标签:
【中文标题】在构建版本中找不到数据类 Kotlin 的序列化程序【英文标题】:Serializer for data class Kotlin not found at build release 【发布时间】:2021-04-03 04:26:13 【问题描述】:我想将我的 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
【问题讨论】:
【参考方案1】:如果您使用的是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
【讨论】:
【参考方案2】:我找到了下一个解决方案:
第一步,我添加了@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'
它奏效了,它拯救了我的一天!!
【讨论】:
【参考方案3】:我已经修复了 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'
请注意版本号可能不同。
【讨论】:
【参考方案4】:我遇到了同样的问题,出于一个奇怪的原因将我的 val 参数更改为 var 修复了它。我希望它也对你有用。
【讨论】:
以上是关于在构建版本中找不到数据类 Kotlin 的序列化程序的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程协程启动 ① ( 协程构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )
Kotlin 协程协程启动 ① ( 协程构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )
错误:在 Ionic 3 中找不到 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.60-eap-25