You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:45:42