【问题标题】:Kotlin Serialization: "Unresolved reference: serializer"Kotlin 序列化:“未解析的引用:序​​列化程序”
【发布时间】:2019-02-18 16:55:43
【问题描述】:

我正在尝试 Kotlin 序列化。按照说明进行设置后,我收到Unresolved reference: serializer 生成错误代码:

val serializer : KSerializer<User> = User.serializer()

我推测编译器插件不知何故没有启动,但看不到我在设置中错过了什么。

这是我的build.gradle.kts

buildscript {
    val kotlinVer: String by extra("1.3.20")
    repositories { jcenter() }

    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVer")
        classpath("org.jetbrains.kotlin:kotlin-serialization:$kotlinVer")
    }
}

plugins {
    id("org.jetbrains.kotlin.jvm").version("1.3.20")

    application

    "kotlin"
    "kotlinx-serialization"
}

repositories {
    jcenter()
    maven("https://kotlin.bintray.com/kotlinx")
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compile("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.10.0")

    testImplementation("org.jetbrains.kotlin:kotlin-test")

    testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
}

application {
    mainClassName = "com.digizen.AppKt"
}

【问题讨论】:

  • 1.这是唯一的错误吗?也许在serializer() 之前发生了一些事情,其余的会生成。 2. 以防万一,请仔细检查User 是否被注释为@Serializable
  • @AlexeyRomanov 1. 是的,这是唯一的错误,无论我是从命令行还是在 IntelliJ 中构建。 2. 是的,User 被注释为@Serializable

标签: serialization kotlin


【解决方案1】:

plugins 中,不能像之前那样只放一个字符串the options are (for .kts)

plugins {
    `«plugin id»`                                             // (1)
    id(«plugin id»)                                           // (2)
    id(«plugin id») version «plugin version» [apply «false»]  // (3)
} 

我认为 Kotlin 插件本身的激活是因为 id("org.jetbrains.kotlin.jvm").version("1.3.20"),而不是因为 "kotlin"

自述文件说

Gradle (with plugins block)

您可以使用 Gradle 插件 DSL 而不是传统的应用插件,使用 kotlin 插件设置序列化插件:

plugins {
    id 'kotlin-multiplatform' version '1.3.20'
    id 'kotlinx-serialization' version '1.3.20'
}

在这种情况下,由于序列化插件尚未发布到 Gradle 插件门户,您需要在 settings.gradle 中添加插件解析规则:

pluginManagement {
    resolutionStrategy {
        eachPlugin {
            if (requested.id.id == "kotlin-multiplatform") {
                useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:${requested.version}")
            }
            if (requested.id.id == "kotlinx-serialization") {
                useModule("org.jetbrains.kotlin:kotlin-serialization:${requested.version}")
            }
        }
    }
}

不要忘记从 buildscript 依赖项中删除插件的类路径依赖项,否则,您将收到有关版本冲突的错误。

因此,最小的变化是从 plugins 块中删除两个字符串,然后 添加

apply plugin: 'kotlinx-serialization'

改为。

【讨论】:

  • 如果我apply plugin 它抛出:Plugin with id 'kotlinx-serialization' not found。在 buildscript 存储库中添加了依赖项和 `maven { url "kotlin.bintray.com/kotlinx" } `
  • @fisio 您可能想将其作为一个单独的问题提出。
【解决方案2】:

Android Kotlin 答案

关注文档:Serialization Adding for Android + Kotlin

关键点:build.gradle - 模块

dependencies {
   implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多