1

我很难找到有关如何反序列化日期字段的文档。我如何实现这一目标?我在 SO 上找到的大多数解决方案都不起作用,或者他们使用不再可用的类

@Serializable
data class Dashboard(
    val someNumber: Int,
    val someDate: Date? // Custom Deserialization from unix timestamp
)

编辑:我发现使用的大多数解决方案PrimitiveSerialDescriptor似乎不可用

4

2 回答 2

3

最新版本的kotlinx.serialization 有很好的文档https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#custom-serializers

但是,问题中没有PrimitiveSerialDescriptor类,这意味着使用了一些旧版本的kotlinx.serialization

https://github.com/Kotlin/kotlinx.serialization/releases可以发现在1.0.0-RC版本中

PrimitiveDescriptor改名为PrimitiveSerialDescriptor

@Serializable带有注释和Json格式的核心工件的 id从kotlinx-serialization-runtime更改kotlinx-serialization-core为更清晰,并与其他 kotlinx 库保持一致。

接下来,这里是kotlinx.serialization版本0.20.0的代码示例:

object DateSerializer : KSerializer<Date> {
    override val descriptor = PrimitiveDescriptor("Date", PrimitiveKind.LONG)
    override fun serialize(encoder: Encoder, value: Date) = encoder.encodeLong(value.time)
    override fun deserialize(decoder: Decoder): Date = Date(decoder.decodeLong())
}

@Serializable
data class MyDto(
    @Serializable(DateSerializer::class)
    val date: Date
)

fun main() {
    val dto = Json.parse(MyDto.serializer(), """{ "date" : 1630407000000 }""")
    println(dto.date)
}

build.gradle.kts

plugins {
    kotlin("jvm") version "1.3.72"
    kotlin("plugin.serialization") version "1.3.72"
}
repositories { mavenCentral() }
dependencies {
    implementation("org.jetbrains.kotlinx", "kotlinx-serialization-runtime", "0.20.0")
}
于 2021-08-31T12:23:19.173 回答
2

不要使用 Date,而是使用InstantLocalDateTime,您需要在 build.gradle 文件中添加它

implementation "org.jetbrains.kotlinx:kotlinx-datetime:0.3.2"

在此链接中了解更多信息: https ://github.com/Kotlin/kotlinx-datetime

这将自动序列化并且也可以在 KMM 中工作

于 2022-02-06T11:13:27.993 回答