如何解决Kotlin commonMain 与 java.io.Serializable
问题
我在 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
并不是完全开发为 java.io.Serializable
抽象或其他东西。它是一个纯粹的 kotlin 序列化库,用于序列化/反序列化 JSON
对象。
是的,我会说您的第一种方法是正确的解决方案。
Parcelize
有一个类似的实现,您可以查看 moko-parcelize,它在做同样的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。