【问题标题】:kotlinx-serialization class marked @Serializable does not have the .serializer() extension function标记为 @Serializable 的 kotlinx-serialization 类没有 .serializer() 扩展函数
【发布时间】:2020-06-13 07:33:43
【问题描述】:

我有以下数据类

@Serializable
data class Income(val id: String, 
                  val description: String, 
                  val amount: Int, 
                  val Time: Date, 
                  val userId: String)

现在当我尝试使用 .serializer() 函数时,它说 .serializer() 没有为 Income 类定义,因此我的项目无法编译。

    val response = Json.stringify(Income.serializer(), Incomes)
    call.respond(HttpStatusCode.OK,response) 

我在readme.md 中的文档上看了两遍。 连KotlinConf的公告视频都看了

有没有人遇到同样的问题。我做错了什么??

编辑:

我试图从 readme.md 中复制粘贴样本,但遇到了同样的问题。

import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class Data(val a: Int, val b: String = "42")

fun main() {
    // Json also has .Default configuration which provides more reasonable settings,
    // but is subject to change in future versions
    val json = Json(JsonConfiguration.Stable)
    // serializing objects
    val jsonData = json.stringify(Data.serializer(), Data(42))
    // serializing lists
    val jsonList = json.stringify(Data.serializer().list, listOf(Data(42)))
    println(jsonData) // {"a": 42, "b": "42"}
    println(jsonList) // [{"a": 42, "b": "42"}]

    // parsing data back
    val obj = json.parse(Data.serializer(), """{"a":42}""") // b is optional since it has default value
    println(obj) // Data(a=42, b="42")
}

这在我的代码中也无法编译。 我目前正在使用 Kotlin 1.3..61 和 kotlinx-序列化运行时 0.14.0

【问题讨论】:

  • 你是否包含了编译器插件?
  • 就是这样!错过它我觉得很愚蠢!您能否将其发布为答案,以便我将其标记为正确答案。

标签: kotlin kotlinx.serialization


【解决方案1】:

除了kotlinx-serialization-runtime 依赖,你还需要add the plugin

plugins {
    kotlin("multiplatform") // or kotlin("jvm") or any other kotlin plugin
    kotlin("plugin.serialization") version "1.4.10"
}

与 Kotlin 本身的版本相同。

【讨论】:

  • 为了消除 ktor 上的错误,我需要将 id 'org.jetbrains.kotlin.plugin.serialization' 版本 '1.4.10' 添加到我的 build.gradle 文件的插件部分
  • 在这里聚会有点晚了,但是您有没有机会向我解释为什么我们需要插件和依赖项才能运行此代码?我对 Gradle 的有限理解是插件提供了要在构建过程本身期间使用的任务,而依赖项表示要在编译和/或运行时使用的类路径。不包含此插件不会阻止代码被编译,但它是运行所必需的。为什么?
  • 问题说它确实阻止了代码被编译:“它说 .serializer() 没有为收入类定义,所以我的项目没有编译”。如果你的情况不是这样,我也很惊讶。
  • 嗯。即使假设不包含插件代码无法编译,为什么任何代码的编译都依赖于 Gradle 构建文件中的插件?
  • 为什么不呢?插件可以: 1) 生成用户编写的代码所需要的代码; 2) 改变编译选项; 3) 在 Kotlin 的情况下,激活编译器插件。所有这些都会影响编译。
【解决方案2】:

我有一个类似的问题,我的 Navigation Drawer XML 文件无法识别我的可序列化类,因为我必须自己扩展 java.io.Serializable,对于 kotlin 来说这很好:

@Serializable
data class Income(val id: String, 
                  val description: String, 
                  val amount: Int, 
                  val Time: Date, 
                  val userId: String) : java.io.Serializable

【讨论】:

  • 这很棒,我尝试了其他所有方法,但没有任何效果
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2011-05-14
  • 2016-04-30
相关资源
最近更新 更多