微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kotlin commonMain 与 java.io.Serializable

如何解决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 数据类。

问题

  1. 具有预期类型和实际类型的解决方案是解决此问题的最佳解决方案吗?
  2. kotlinx.serialization 是否也能提供解决方案?如果是这样,我应该更改什么代码

解决方法

kotlinx.serialization 并不是完全开发为 java.io.Serializable 抽象或其他东西。它是一个纯粹的 kotlin 序列化库,用于序列化/反序列化 JSON 对象。

是的,我会说您的第一种方法是正确的解决方案。 Parcelize 有一个类似的实现,您可以查看 moko-parcelize,它在做同样的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。