【发布时间】:2021-04-29 22:01:33
【问题描述】:
问题
我在 commonMain 中有一个数据类(称为 Person),我想从 jvmMain 以 java.io.Serializable 类型访问它。
我有一个解决方案,如下所示,但我想知道这是否是最好的方法。我还发现库 kotlinx.serialization 存在,但我不确定它是否可以成为解决方案。
当前代码和解决方案:预期类型和实际类型
此代码运行良好,尽管所需的 DummyInterface 可能有点没用。
// CommonMain
expect interface Serializable
data class Person(val name: String) : Serializable
// jsMain
interface DummyInterface
actual typealias Serializable = DummyInterface
//jvmMain
actual typealias Serializable = java.io.Serializable
fun main(args: Array<String>) {
val p1: java.io.Serializable = Person("abc")
println(p1)
}
使用 kotlinx.serialization 尝试和失败的代码
// gradle.kotlin.kts
plugins {
application
kotlin("multiplatform") version "1.4.32"
kotlin("plugin.serialization") version "1.4.32"
}
repositories {
mavenCentral()
}
kotlin {
jvm {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
withJava()
}
js(IR) {
binaries.executable()
browser {}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0")
}
}
val jvmMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0")
}
}
}
}
// commonMain/kotlin/Person.kt
import kotlinx.serialization.*
@Serializable
data class Person(val name: String)
// jvmMain/kotlin/main.kt
fun main(args: Array<String>) {
// Fails with: "Type mismatch: inferred type is Person but Serializable was expected"
val p1: java.io.Serializable = Person("abc")
println(p1)
}
我知道为什么它会因类型不匹配而失败,但我希望 kotlinx.serialization 插件能神奇地将接口 java.io.Serializable 添加到 Person 数据类。
问题
- 具有预期类型和实际类型的解决方案是该问题的最佳解决方案吗?
- kotlinx.serialization 也能提供解决方案吗?如果是这样,我应该更改什么代码?
【问题讨论】:
标签: kotlin serialization kotlin-multiplatform kotlinx.serialization