升级kotlinx-serialization至1.4.0后Duration序列化冲突及找不到序列化器问题
问题描述
之前使用的依赖配置:
kotlin("jvm") kotlin("plugin.serialization") version "1.7.10" implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
由于当时kotlin.time.Duration无官方序列化器,自定义了DurationSerializer,使用正常。
计划将kotlinx序列化库升级到1.4.0版本(该版本自带DurationSerializer),升级后编译器抛出错误:
Caused by: java.lang.IllegalArgumentException: The name of serial descriptor should uniquely identify associated serializer. For serial name Duration there already exist DurationSerializer.
删除自定义的DurationSerializer并清理项目后重新编译,又出现新报错:
Serializer has not been found for type 'Duration'. To use context serializer as fallback, explicitly annotate type or property with @Contextual
问题:新版本能检测到自定义序列化器与官方的冲突,但删除自定义后又无法使用官方自带的序列化器,该如何解决?
解决方案
1. 对齐Kotlin与序列化库版本
kotlinx-serialization的版本需要和Kotlin插件版本严格匹配。你当前Kotlin插件是1.7.10,而序列化库升级到1.4.0,两者版本不兼容——kotlinx-serialization 1.4.0对应的Kotlin版本应为1.8.0及以上。同步升级依赖配置:
kotlin("jvm") version "1.8.0" kotlin("plugin.serialization") version "1.8.0" implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0")
2. 手动注册官方序列化器(不升级Kotlin版本的方案)
如果暂时不想升级Kotlin版本,可以手动在序列化配置中注册官方的DurationSerializer:
val json = Json { serializersModule = SerializersModule { contextual(Duration::class, DurationSerializer) } }
或者直接在使用Duration的属性上指定序列化器:
@Serializable data class Example( @Serializable(with = DurationSerializer::class) val timeout: Duration )
3. 彻底清理项目缓存
项目缓存可能残留旧序列化器的信息,执行以下操作确保清理干净:
- 执行Gradle的
clean任务 - 删除项目根目录的
.gradle文件夹 - 清除IDE缓存(如IntelliJ中选择
File -> Invalidate Caches...) - 重新同步Gradle项目
内容的提问来源于stack exchange,提问作者sigma1510
相关产品推荐
相关产品推荐

