【问题标题】:Kotlin commonMain with java.io.SerializableKotlin commonMain 与 java.io.Serializable
【发布时间】: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 数据类。

问题

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

【问题讨论】:

    标签: kotlin serialization kotlin-multiplatform kotlinx.serialization


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2021-02-18
      • 2021-09-09
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多