Getting kotlinx serialization working in multiplatform project

不羁的心 提交于 2020-06-29 06:43:31

问题


I'm taking Kotlin seriazliation for a test drive in a multiplatform project in Kotlin 1.4-M2, following the tutorial on github, but i'm not getting the serialization bit to compile.

This is my build.gradle.kts

plugins {
    val kotlinVersion = "1.4-M2"
    kotlin("multiplatform") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
}
repositories {
    mavenCentral()
    maven {
        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
    }
    maven {
        url = uri("https://kotlin.bintray.com/kotlinx")
    }
    jcenter()
    gradlePluginPortal()
}
kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = "11"
        }
    }
    js(IR) {
        moduleName = "hotel"
        browser {
            dceTask {
                keep(
                   ...
                )
            }
            binaries.executable()
        }
    }

    sourceSets {

        // val serializationVersion = "0.20.0-1.4-M2"
        val serializationVersion = "0.20.0"

        val commonMain by getting {
            dependencies {
                implementation(kotlin("stdlib-common"))
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serializationVersion")
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
                implementation(kotlin("reflect"))
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion")
            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        val jsMain by getting {
            dependencies {
                implementation(kotlin("stdlib-js"))
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serializationVersion")
            }
        }
        val jsTest by getting {
            dependencies {
                implementation(kotlin("test-js"))
            }
        }
        all {
            languageSettings.enableLanguageFeature("InlineClasses")
        }
    }
}


I've tried it on a simple data class


@Serializable
data class Test(

    val blah: Int = 0

)
import kotlinx.serialization.json.Json <<<--- Unresolved reference: kotlinx
import kotlinx.serialization.json.JsonConfiguration <<<--- Unresolved reference: kotlinx
import kotlin.js.ExperimentalJsExport
import kotlin.js.JsExport

...

fun main() {
    val json = Json(JsonConfiguration.Default)
    val jstring = json.toJson(Test.serializer(), Test(blah = 3))
    println(jstring.toString())
}

It's complaining about Unresolved reference: kotlinx

Is there something specific one needs to do to make kotlinx imports work or should i be using different versions of the serializer libraries?


回答1:


I got some help on Slack, thanks Sergey!

https://kotlinlang.org/eap/ shows the versions compatible with the EAP or Milestone releases. You should use the serialization runtime version 0.20.0-1.4-M2. Note that with this version, you need to add a single dependency on kotlinx-serialization-runtime in the commonMain source set, not separate dependencies on kotlinx-serialization-runtime-common and the platform parts. See the Specifying dependencies only once section here: https://blog.jetbrains.com/kotlin/2020/06/kotlin-1-4-m2-released

So in short, my plugin should be matching my Kotlin version

plugins {
    val kotlinVersion = "1.4-M2"
    kotlin("multiplatform") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
}

then under sourceSets, i should be using a single dependency instead of one per platform

    sourceSets {

        val serializationVersion = "0.20.0-1.4-M2"

        val commonMain by getting {
            dependencies {
                implementation(kotlin("stdlib-common"))
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion")
            }
        }

JVM and JS Main should not have any serialization plugin, so those lines should be removed

        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
                implementation(kotlin("reflect"))
                // implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion") <<-- remove this

        val jsMain by getting {
            dependencies {
                implementation(kotlin("stdlib-js"))
                // implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serializationVersion") <<-- remove this
            }
        }


来源:https://stackoverflow.com/questions/62353680/getting-kotlinx-serialization-working-in-multiplatform-project

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!