Skip to content

Commit a772c9e

Browse files
committed
Ensure different serial names for incompatible serializers
Fixes #416
1 parent 043c9fa commit a772c9e

13 files changed

+46
-29
lines changed

core/common/src/DateTimePeriod.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import kotlinx.datetime.internal.*
99
import kotlinx.datetime.serializers.DatePeriodIso8601Serializer
1010
import kotlinx.datetime.serializers.DateTimePeriodIso8601Serializer
1111
import kotlinx.datetime.serializers.DatePeriodComponentSerializer
12+
import kotlinx.datetime.serializers.DatePeriodSerializer
1213
import kotlinx.datetime.serializers.DateTimePeriodComponentSerializer
14+
import kotlinx.datetime.serializers.DateTimePeriodSerializer
1315
import kotlin.math.*
1416
import kotlin.time.Duration
1517
import kotlinx.serialization.Serializable
@@ -63,13 +65,14 @@ import kotlinx.serialization.Serializable
6365
* `DateTimePeriod` can also be returned as the result of instant arithmetic operations (see [Instant.periodUntil]).
6466
*
6567
* Additionally, there are several `kotlinx-serialization` serializers for [DateTimePeriod]:
66-
* - [DateTimePeriodIso8601Serializer] for the ISO 8601 format;
68+
* - The default serializer, delegating to [toString] and [parse].
69+
* - [DateTimePeriodIso8601Serializer] for the ISO 8601 format.
6770
* - [DateTimePeriodComponentSerializer] for an object with components.
6871
*
6972
* @sample kotlinx.datetime.test.samples.DateTimePeriodSamples.construction
7073
* @sample kotlinx.datetime.test.samples.DateTimePeriodSamples.simpleParsingAndFormatting
7174
*/
72-
@Serializable(with = DateTimePeriodIso8601Serializer::class)
75+
@Serializable(with = DateTimePeriodSerializer::class)
7376
// TODO: could be error-prone without explicitly named params
7477
public sealed class DateTimePeriod {
7578
internal abstract val totalMonths: Long
@@ -430,7 +433,7 @@ public fun String.toDateTimePeriod(): DateTimePeriod = DateTimePeriod.parse(this
430433
*
431434
* @sample kotlinx.datetime.test.samples.DatePeriodSamples.simpleParsingAndFormatting
432435
*/
433-
@Serializable(with = DatePeriodIso8601Serializer::class)
436+
@Serializable(with = DatePeriodSerializer::class)
434437
public class DatePeriod internal constructor(
435438
internal override val totalMonths: Long,
436439
override val days: Int,

core/common/src/serializers/DateTimePeriodSerializers.kt

+16-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.encoding.*
1919
public object DateTimePeriodComponentSerializer: KSerializer<DateTimePeriod> {
2020

2121
override val descriptor: SerialDescriptor =
22-
buildClassSerialDescriptor("kotlinx.datetime.DateTimePeriod") {
22+
buildClassSerialDescriptor("kotlinx.datetime.DateTimePeriod components") {
2323
element<Int>("years", isOptional = true)
2424
element<Int>("months", isOptional = true)
2525
element<Int>("days", isOptional = true)
@@ -81,7 +81,7 @@ public object DateTimePeriodComponentSerializer: KSerializer<DateTimePeriod> {
8181
public object DateTimePeriodIso8601Serializer: KSerializer<DateTimePeriod> {
8282

8383
override val descriptor: SerialDescriptor =
84-
PrimitiveSerialDescriptor("kotlinx.datetime.DateTimePeriod", PrimitiveKind.STRING)
84+
PrimitiveSerialDescriptor("kotlinx.datetime.DateTimePeriod ISO", PrimitiveKind.STRING)
8585

8686
override fun deserialize(decoder: Decoder): DateTimePeriod =
8787
DateTimePeriod.parse(decoder.decodeString())
@@ -110,7 +110,7 @@ public object DatePeriodComponentSerializer: KSerializer<DatePeriod> {
110110
private fun unexpectedNonzero(fieldName: String, value: Int) = unexpectedNonzero(fieldName, value.toLong())
111111

112112
override val descriptor: SerialDescriptor =
113-
buildClassSerialDescriptor("kotlinx.datetime.DatePeriod") {
113+
buildClassSerialDescriptor("kotlinx.datetime.DatePeriod components") {
114114
element<Int>("years", isOptional = true)
115115
element<Int>("months", isOptional = true)
116116
element<Int>("days", isOptional = true)
@@ -166,7 +166,7 @@ public object DatePeriodComponentSerializer: KSerializer<DatePeriod> {
166166
public object DatePeriodIso8601Serializer: KSerializer<DatePeriod> {
167167

168168
override val descriptor: SerialDescriptor =
169-
PrimitiveSerialDescriptor("kotlinx.datetime.DatePeriod", PrimitiveKind.STRING)
169+
PrimitiveSerialDescriptor("kotlinx.datetime.DatePeriod ISO", PrimitiveKind.STRING)
170170

171171
override fun deserialize(decoder: Decoder): DatePeriod =
172172
when (val period = DateTimePeriod.parse(decoder.decodeString())) {
@@ -179,3 +179,15 @@ public object DatePeriodIso8601Serializer: KSerializer<DatePeriod> {
179179
}
180180

181181
}
182+
183+
@PublishedApi
184+
internal object DateTimePeriodSerializer: KSerializer<DateTimePeriod> by DateTimePeriodIso8601Serializer {
185+
override val descriptor =
186+
PrimitiveSerialDescriptor("kotlinx.datetime.DateTimePeriod", PrimitiveKind.STRING)
187+
}
188+
189+
@PublishedApi
190+
internal object DatePeriodSerializer: KSerializer<DatePeriod> by DatePeriodIso8601Serializer {
191+
override val descriptor =
192+
PrimitiveSerialDescriptor("kotlinx.datetime.DatePeriod", PrimitiveKind.STRING)
193+
}

core/common/src/serializers/InstantSerializers.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import kotlinx.serialization.encoding.*
2222
public object InstantIso8601Serializer : KSerializer<Instant> {
2323

2424
override val descriptor: SerialDescriptor =
25-
PrimitiveSerialDescriptor("kotlinx.datetime.Instant", PrimitiveKind.STRING)
25+
PrimitiveSerialDescriptor("kotlinx.datetime.Instant ISO", PrimitiveKind.STRING)
2626

2727
override fun deserialize(decoder: Decoder): Instant =
2828
Instant.parse(decoder.decodeString(), DateTimeComponents.Formats.ISO_DATE_TIME_OFFSET)
@@ -41,7 +41,7 @@ public object InstantIso8601Serializer : KSerializer<Instant> {
4141
public object InstantComponentSerializer : KSerializer<Instant> {
4242

4343
override val descriptor: SerialDescriptor =
44-
buildClassSerialDescriptor("kotlinx.datetime.Instant") {
44+
buildClassSerialDescriptor("kotlinx.datetime.Instant components") {
4545
element<Long>("epochSeconds")
4646
element<Long>("nanosecondsOfSecond", isOptional = true)
4747
}

core/common/src/serializers/LocalDateSerializers.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.encoding.*
1919
* @see LocalDate.Formats.ISO
2020
*/
2121
public object LocalDateIso8601Serializer : KSerializer<LocalDate>
22-
by LocalDate.Formats.ISO.asKSerializer("kotlinx.datetime.LocalDate")
22+
by LocalDate.Formats.ISO.asKSerializer("kotlinx.datetime.LocalDate ISO")
2323

2424
/**
2525
* A serializer for [LocalDate] that represents a value as its components.
@@ -29,7 +29,7 @@ by LocalDate.Formats.ISO.asKSerializer("kotlinx.datetime.LocalDate")
2929
public object LocalDateComponentSerializer: KSerializer<LocalDate> {
3030

3131
override val descriptor: SerialDescriptor =
32-
buildClassSerialDescriptor("kotlinx.datetime.LocalDate") {
32+
buildClassSerialDescriptor("kotlinx.datetime.LocalDate components") {
3333
element<Int>("year")
3434
element<Short>("month")
3535
element<Short>("day")

core/common/src/serializers/LocalDateTimeSerializers.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.encoding.*
1919
* @see LocalDateTime.Formats.ISO
2020
*/
2121
public object LocalDateTimeIso8601Serializer : KSerializer<LocalDateTime>
22-
by LocalDateTime.Formats.ISO.asKSerializer("kotlinx.datetime.LocalDateTime")
22+
by LocalDateTime.Formats.ISO.asKSerializer("kotlinx.datetime.LocalDateTime ISO")
2323

2424
/**
2525
* A serializer for [LocalDateTime] that represents a value as its components.
@@ -29,7 +29,7 @@ by LocalDateTime.Formats.ISO.asKSerializer("kotlinx.datetime.LocalDateTime")
2929
public object LocalDateTimeComponentSerializer: KSerializer<LocalDateTime> {
3030

3131
override val descriptor: SerialDescriptor =
32-
buildClassSerialDescriptor("kotlinx.datetime.LocalDateTime") {
32+
buildClassSerialDescriptor("kotlinx.datetime.LocalDateTime components") {
3333
element<Int>("year")
3434
element<Short>("month")
3535
element<Short>("day")

core/common/src/serializers/LocalTimeSerializers.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.encoding.*
1919
* @see LocalTime.Formats.ISO
2020
*/
2121
public object LocalTimeIso8601Serializer : KSerializer<LocalTime>
22-
by LocalTime.Formats.ISO.asKSerializer("kotlinx.datetime.LocalTime")
22+
by LocalTime.Formats.ISO.asKSerializer("kotlinx.datetime.LocalTime ISO")
2323

2424
/**
2525
* A serializer for [LocalTime] that represents a value as its components.
@@ -29,7 +29,7 @@ by LocalTime.Formats.ISO.asKSerializer("kotlinx.datetime.LocalTime")
2929
public object LocalTimeComponentSerializer : KSerializer<LocalTime> {
3030

3131
override val descriptor: SerialDescriptor =
32-
buildClassSerialDescriptor("kotlinx.datetime.LocalTime") {
32+
buildClassSerialDescriptor("kotlinx.datetime.LocalTime components") {
3333
element<Short>("hour")
3434
element<Short>("minute")
3535
element<Short>("second", isOptional = true)

core/common/src/serializers/TimeZoneSerializers.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public object FixedOffsetTimeZoneSerializer: KSerializer<FixedOffsetTimeZone> {
6060
* @see UtcOffset.Formats.ISO
6161
*/
6262
public object UtcOffsetIso8601Serializer : KSerializer<UtcOffset>
63-
by UtcOffset.Formats.ISO.asKSerializer("kotlinx.datetime.UtcOffset")
63+
by UtcOffset.Formats.ISO.asKSerializer("kotlinx.datetime.UtcOffset ISO")
6464

6565
/**
6666
* A serializer for [UtcOffset] that uses the default [UtcOffset.toString]/[UtcOffset.parse].

serialization/common/test/DateTimePeriodSerializationTest.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -97,25 +97,25 @@ class DateTimePeriodSerializationTest {
9797

9898
@Test
9999
fun testDatePeriodIso8601Serialization() {
100-
assertKSerializerName("kotlinx.datetime.DatePeriod", DatePeriodIso8601Serializer)
100+
assertKSerializerName("kotlinx.datetime.DatePeriod ISO", DatePeriodIso8601Serializer)
101101
datePeriodIso8601Serialization(DatePeriodIso8601Serializer, DateTimePeriodIso8601Serializer)
102102
}
103103

104104
@Test
105105
fun testDatePeriodComponentSerialization() {
106-
assertKSerializerName("kotlinx.datetime.DatePeriod", DatePeriodComponentSerializer)
106+
assertKSerializerName("kotlinx.datetime.DatePeriod components", DatePeriodComponentSerializer)
107107
datePeriodComponentSerialization(DatePeriodComponentSerializer, DateTimePeriodComponentSerializer)
108108
}
109109

110110
@Test
111111
fun testDateTimePeriodIso8601Serialization() {
112-
assertKSerializerName("kotlinx.datetime.DateTimePeriod", DateTimePeriodIso8601Serializer)
112+
assertKSerializerName("kotlinx.datetime.DateTimePeriod ISO", DateTimePeriodIso8601Serializer)
113113
dateTimePeriodIso8601Serialization(DateTimePeriodIso8601Serializer)
114114
}
115115

116116
@Test
117117
fun testDateTimePeriodComponentSerialization() {
118-
assertKSerializerName("kotlinx.datetime.DateTimePeriod", DateTimePeriodComponentSerializer)
118+
assertKSerializerName("kotlinx.datetime.DateTimePeriod components", DateTimePeriodComponentSerializer)
119119
dateTimePeriodComponentSerialization(DateTimePeriodComponentSerializer)
120120
}
121121

serialization/common/test/InstantSerializationTest.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ class InstantSerializationTest {
7070

7171
@Test
7272
fun testIso8601Serialization() {
73-
assertKSerializerName("kotlinx.datetime.Instant", InstantIso8601Serializer)
73+
assertKSerializerName("kotlinx.datetime.Instant ISO", InstantIso8601Serializer)
7474
iso8601Serialization(InstantIso8601Serializer)
7575
}
7676

7777
@Test
7878
fun testComponentSerialization() {
79-
assertKSerializerName("kotlinx.datetime.Instant", InstantComponentSerializer)
79+
assertKSerializerName("kotlinx.datetime.Instant components", InstantComponentSerializer)
8080
componentSerialization(InstantComponentSerializer)
8181
}
8282

serialization/common/test/LocalDateSerializationTest.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ class LocalDateSerializationTest {
5656

5757
@Test
5858
fun testIso8601Serialization() {
59-
assertKSerializerName("kotlinx.datetime.LocalDate", LocalDateIso8601Serializer)
59+
assertKSerializerName("kotlinx.datetime.LocalDate ISO", LocalDateIso8601Serializer)
6060
iso8601Serialization(LocalDateIso8601Serializer)
6161
}
6262

6363
@Test
6464
fun testComponentSerialization() {
65-
assertKSerializerName("kotlinx.datetime.LocalDate", LocalDateComponentSerializer)
65+
assertKSerializerName("kotlinx.datetime.LocalDate components", LocalDateComponentSerializer)
6666
componentSerialization(LocalDateComponentSerializer)
6767
}
6868

serialization/common/test/LocalDateTimeSerializationTest.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,15 @@ class LocalDateTimeSerializationTest {
8383

8484
@Test
8585
fun testIso8601Serialization() {
86-
assertKSerializerName<LocalDateTime>("kotlinx.datetime.LocalDateTime", LocalDateTimeComponentSerializer)
86+
assertKSerializerName<LocalDateTime>("kotlinx.datetime.LocalDateTime ISO", LocalDateTimeIso8601Serializer)
8787
iso8601Serialization(LocalDateTimeIso8601Serializer)
8888
}
8989

9090
@Test
9191
fun testComponentSerialization() {
92-
assertKSerializerName<LocalDateTime>("kotlinx.datetime.LocalDateTime", LocalDateTimeComponentSerializer)
92+
assertKSerializerName<LocalDateTime>(
93+
"kotlinx.datetime.LocalDateTime components", LocalDateTimeComponentSerializer
94+
)
9395
componentSerialization(LocalDateTimeComponentSerializer)
9496
}
9597

serialization/common/test/LocalTimeSerializationTest.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ class LocalTimeSerializationTest {
7373

7474
@Test
7575
fun testIso8601Serialization() {
76-
assertKSerializerName("kotlinx.datetime.LocalTime", LocalTimeIso8601Serializer)
76+
assertKSerializerName("kotlinx.datetime.LocalTime ISO", LocalTimeIso8601Serializer)
7777
iso8601Serialization(LocalTimeIso8601Serializer)
7878
}
7979

8080
@Test
8181
fun testComponentSerialization() {
82-
assertKSerializerName("kotlinx.datetime.LocalTime", LocalTimeComponentSerializer)
82+
assertKSerializerName("kotlinx.datetime.LocalTime components", LocalTimeComponentSerializer)
8383
componentSerialization(LocalTimeComponentSerializer)
8484
}
8585

serialization/common/test/UtcOffsetSerializationTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class UtcOffsetSerializationTest {
4747

4848
@Test
4949
fun testIso8601Serialization() {
50-
assertKSerializerName<UtcOffset>("kotlinx.datetime.UtcOffset", UtcOffsetIso8601Serializer)
50+
assertKSerializerName<UtcOffset>("kotlinx.datetime.UtcOffset ISO", UtcOffsetIso8601Serializer)
5151
iso8601Serialization(UtcOffsetIso8601Serializer)
5252
}
5353

0 commit comments

Comments
 (0)