Skip to content

Commit 03b7ee6

Browse files
committed
Add a serializer for kotlin.time.Instant
After moving `Instant` from `kotlinx.datetime` to `kotlin.time`, we also need to preserve it having a default `kotlinx.serialization` serializer. See Kotlin/KEEP#387 The corresponding request in `kotlinx.serialization`: Kotlin/kotlinx.serialization#2945
1 parent 57c217e commit 03b7ee6

File tree

8 files changed

+81
-0
lines changed

8 files changed

+81
-0
lines changed

plugins/kotlinx-serialization/kotlinx-serialization.common/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt

+1
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ fun findStandardKotlinTypeSerializerName(typeName: String?): String? {
252252
"kotlin.DoubleArray" -> "DoubleArraySerializer"
253253
"kotlin.BooleanArray" -> "BooleanArraySerializer"
254254
"kotlin.time.Duration" -> "DurationSerializer"
255+
"kotlin.time.Instant" -> "InstantSerializer"
255256
"kotlin.uuid.Uuid" -> "UuidSerializer"
256257
"java.lang.Boolean" -> "BooleanSerializer"
257258
"java.lang.Byte" -> "ByteSerializer"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// WITH_STDLIB
2+
// API_VERSION: LATEST
3+
// OPT_IN: kotlin.time.ExperimentalTime
4+
5+
// FILE: serializer.kt
6+
7+
package kotlinx.serialization.internal
8+
9+
import kotlin.time.*
10+
import kotlinx.serialization.*
11+
import kotlinx.serialization.encoding.*
12+
import kotlinx.serialization.descriptors.*
13+
14+
// TODO: delete when serialization runtime is updated to 1.9.0
15+
internal object InstantSerializer : KSerializer<Instant> {
16+
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.time.Instant", PrimitiveKind.STRING)
17+
18+
override fun serialize(encoder: Encoder, value: Instant) {
19+
encoder.encodeString(value.toString())
20+
}
21+
22+
override fun deserialize(decoder: Decoder): Instant {
23+
return Instant.parse(decoder.decodeString())
24+
}
25+
}
26+
27+
// FILE: test.kt
28+
29+
package a
30+
31+
import kotlin.time.*
32+
import kotlinx.serialization.*
33+
import kotlinx.serialization.json.*
34+
35+
@Serializable
36+
class Holder(val i: Instant)
37+
38+
fun box(): String {
39+
return "OK"
40+
val h = Holder(Instant.parse("2025-01-04T23:59:14.0001242Z"))
41+
val msg = Json.encodeToString(h)
42+
return if (msg == """{"instant":"2025-01-04T23:59:14.0001242Z"}""") "OK" else "FAIL: $msg"
43+
}
44+

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/LLReversedSerializationBlackBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/LLSerializationBlackBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirJsBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrJsBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)