Kotlin多平台项目中kotlinx.serialization无法使用的问题求助
嘿,我来帮你搞定这个序列化的问题!从你的错误信息和配置来看,核心问题是生成的序列化代码没被IDE/构建工具识别到,咱们一步步来修复:
1. 先修正构造函数参数的小问题
首先看你的User类定义:
@Serializable data class User( val user: String )
但你调用的时候写了User(login = "X")——这里参数名不匹配哦,得改成User(user = "X"),这虽然不是报错的主因,但先修正避免后续混淆。
2. 调整生成代码的源目录配置
你在commonMain里指定了自定义的生成代码目录:
kotlin.srcDir("build/generated-src/common")
但kotlinx.serialization插件在Kotlin 1.4+版本里,默认把生成的序列化代码放在build/generated/source/kotlinxSerialization下,分common、backend、frontend各自的子目录。你指定的路径不对,导致IDE找不到那些自动生成的encodeToString扩展函数。
把commonMain里的这行改成:
kotlin.srcDir("build/generated/source/kotlinxSerialization/commonMain")
同时,frontendMain里的对应配置也要改:
kotlin.srcDir("build/generated/source/kotlinxSerialization/frontendMain")
如果backend也需要序列化支持,同样给backendMain加上对应的路径。
3. 确保序列化特性在所有源集启用
虽然你已经加了kotlinx-serialization插件,但可以显式在所有源集里启用序列化特性,避免遗漏:
kotlin { // ... 你的target配置 ... sourceSets { all { languageSettings.apply { enableLanguageFeature("Serialization") } } // ... 其他sourceSet配置 ... } }
4. 清理缓存并重新构建
旧的构建缓存有时候会搞事情,执行以下操作彻底刷新:
- 运行
./gradlew clean清理构建目录 - 运行
./gradlew build重新构建项目 - 重启你的IDE(比如IntelliJ),然后同步Gradle项目,确保IDE能识别到新生成的代码
5. 版本兼容性检查
你的Kotlin版本是1.4.20,kotlinx-serialization-json用的是1.0.1,这俩版本是兼容的(1.0.x系列对应Kotlin 1.4.x),这部分没问题,不用调整。
验证修复
做完上面的步骤后,再调用JSON.encodeToString(User(user = "X")),应该就能正常识别扩展函数了。如果还是有问题,可以去build/generated/source/kotlinxSerialization/commonMain目录下看看,有没有生成类似UserSerializer.kt的文件——如果有,说明代码生成成功,只是IDE还没同步,再重启下IDE就行。
内容的提问来源于stack exchange,提问作者lorefnon

