@@ -247,7 +247,8 @@ import kotlinx.serialization.descriptors.*
247
247
248
248
``` kotlin
249
249
object ColorAsStringSerializer : KSerializer<Color> {
250
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" Color" , PrimitiveKind .STRING )
250
+ // Serial names of descriptors should be unique, this is why we advise including app package in the name.
251
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app.Color" , PrimitiveKind .STRING )
251
252
252
253
override fun serialize (encoder : Encoder , value : Color ) {
253
254
val string = value.rgb.toString(16 ).padStart(6 , ' 0' )
@@ -315,7 +316,7 @@ Deserialization is also straightforward because we implemented the `deserialize`
315
316
316
317
<!-- - INCLUDE
317
318
object ColorAsStringSerializer : KSerializer<Color> {
318
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Color", PrimitiveKind.STRING)
319
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("my.app. Color", PrimitiveKind.STRING)
319
320
320
321
override fun serialize(encoder: Encoder, value: Color) {
321
322
val string = value.rgb.toString(16).padStart(6, '0')
@@ -349,7 +350,7 @@ It also works if we serialize or deserialize a different class with `Color` prop
349
350
350
351
<!-- - INCLUDE
351
352
object ColorAsStringSerializer : KSerializer<Color> {
352
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Color", PrimitiveKind.STRING)
353
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("my.app. Color", PrimitiveKind.STRING)
353
354
354
355
override fun serialize(encoder: Encoder, value: Color) {
355
356
val string = value.rgb.toString(16).padStart(6, '0')
@@ -404,8 +405,9 @@ import kotlinx.serialization.builtins.IntArraySerializer
404
405
405
406
class ColorIntArraySerializer : KSerializer <Color > {
406
407
private val delegateSerializer = IntArraySerializer ()
407
- @OptIn(ExperimentalSerializationApi ::class )
408
- override val descriptor = SerialDescriptor (" Color" , delegateSerializer.descriptor)
408
+
409
+ // Serial names of descriptors should be unique, this is why we advise including app package in the name.
410
+ override val descriptor = SerialDescriptor (" my.app.Color" , delegateSerializer.descriptor)
409
411
410
412
override fun serialize (encoder : Encoder , value : Color ) {
411
413
val data = intArrayOf(
@@ -487,7 +489,8 @@ generated [SerialDescriptor] for the surrogate because it should be indistinguis
487
489
488
490
``` kotlin
489
491
object ColorSerializer : KSerializer<Color> {
490
- override val descriptor: SerialDescriptor = ColorSurrogate .serializer().descriptor
492
+ // Serial names of descriptors should be unique, so we cannot use ColorSurrogate.serializer().descriptor directly
493
+ override val descriptor: SerialDescriptor = SerialDescriptor (" my.app.Color" , ColorSurrogate .serializer().descriptor)
491
494
492
495
override fun serialize (encoder : Encoder , value : Color ) {
493
496
val surrogate = ColorSurrogate ((value.rgb shr 16 ) and 0xff , (value.rgb shr 8 ) and 0xff , value.rgb and 0xff )
@@ -542,7 +545,7 @@ for the corresponding fields by their type. The order of elements is important.
542
545
543
546
```kotlin
544
547
override val descriptor: SerialDescriptor =
545
- buildClassSerialDescriptor("Color") {
548
+ buildClassSerialDescriptor("my.app. Color") {
546
549
element<Int>("r")
547
550
element<Int>("g")
548
551
element<Int>("b")
@@ -633,7 +636,7 @@ The plugin-generated serializers are actually conceptually similar to the code b
633
636
object ColorAsObjectSerializer : KSerializer<Color> {
634
637
635
638
override val descriptor: SerialDescriptor =
636
- buildClassSerialDescriptor("Color") {
639
+ buildClassSerialDescriptor("my.app. Color") {
637
640
element<Int>("r")
638
641
element<Int>("g")
639
642
element<Int>("b")
@@ -712,7 +715,8 @@ import java.text.SimpleDateFormat
712
715
713
716
```kotlin
714
717
object DateAsLongSerializer : KSerializer<Date> {
715
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Date", PrimitiveKind.LONG)
718
+ // Serial names of descriptors should be unique, so choose app-specific name in case some library also would declare a serializer for Date.
719
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("my.app.DateAsLong", PrimitiveKind.LONG)
716
720
override fun serialize(encoder: Encoder, value: Date) = encoder.encodeLong(value.time)
717
721
override fun deserialize(decoder: Decoder): Date = Date(decoder.decodeLong())
718
722
}
@@ -757,7 +761,7 @@ import java.util.Date
757
761
import java.text.SimpleDateFormat
758
762
759
763
object DateAsLongSerializer : KSerializer<Date> {
760
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" Date " , PrimitiveKind .LONG )
764
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app.DateAsLong " , PrimitiveKind .LONG )
761
765
override fun serialize (encoder : Encoder , value : Date ) = encoder.encodeLong(value.time)
762
766
override fun deserialize (decoder : Decoder ): Date = Date (decoder.decodeLong())
763
767
}
@@ -798,7 +802,7 @@ import java.util.Date
798
802
import java.text.SimpleDateFormat
799
803
800
804
object DateAsLongSerializer : KSerializer<Date> {
801
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" Date " , PrimitiveKind .LONG )
805
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app.DateAsLong " , PrimitiveKind .LONG )
802
806
override fun serialize (encoder : Encoder , value : Date ) = encoder.encodeLong(value.time)
803
807
override fun deserialize (decoder : Decoder ): Date = Date (decoder.decodeLong())
804
808
}
@@ -842,7 +846,7 @@ import java.util.Date
842
846
import java.text.SimpleDateFormat
843
847
844
848
object DateAsLongSerializer : KSerializer<Date> {
845
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" Date " , PrimitiveKind .LONG )
849
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app.DateAsLong " , PrimitiveKind .LONG )
846
850
override fun serialize (encoder : Encoder , value : Date ) = encoder.encodeLong(value.time)
847
851
override fun deserialize (decoder : Decoder ): Date = Date (decoder.decodeLong())
848
852
}
@@ -882,13 +886,13 @@ import java.util.TimeZone
882
886
import java.text.SimpleDateFormat
883
887
884
888
object DateAsLongSerializer : KSerializer<Date> {
885
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" DateAsLong" , PrimitiveKind .LONG )
889
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app. DateAsLong" , PrimitiveKind .LONG )
886
890
override fun serialize (encoder : Encoder , value : Date ) = encoder.encodeLong(value.time)
887
891
override fun deserialize (decoder : Decoder ): Date = Date (decoder.decodeLong())
888
892
}
889
893
890
894
object DateAsSimpleTextSerializer: KSerializer<Date> {
891
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" DateAsSimpleText" , PrimitiveKind .LONG )
895
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app. DateAsSimpleText" , PrimitiveKind .LONG )
892
896
private val format = SimpleDateFormat (" yyyy-MM-dd" ).apply {
893
897
// Here we explicitly set time zone to UTC so output for this sample remains locale-independent.
894
898
// Depending on your needs, you may have to adjust or remove this line.
@@ -946,7 +950,7 @@ serialization, delegating everything to the underlying serializer of its `data`
946
950
947
951
```kotlin
948
952
class BoxSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<Box<T>> {
949
- override val descriptor: SerialDescriptor = dataSerializer.descriptor
953
+ override val descriptor: SerialDescriptor = SerialDescriptor("my.app.Box", dataSerializer.descriptor)
950
954
override fun serialize(encoder: Encoder, value: Box<T>) = dataSerializer.serialize(encoder, value.contents)
951
955
override fun deserialize(decoder: Decoder) = Box(dataSerializer.deserialize(decoder))
952
956
}
@@ -1007,7 +1011,7 @@ An example of using two serializers at once:
1007
1011
1008
1012
< ! -- - INCLUDE
1009
1013
object ColorAsStringSerializer : KSerializer<Color> {
1010
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" Color" , PrimitiveKind .STRING )
1014
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" my.app. Color" , PrimitiveKind .STRING )
1011
1015
1012
1016
override fun serialize (encoder : Encoder , value : Color ) {
1013
1017
val string = value.rgb.toString(16 ).padStart(6 , ' 0' )
@@ -1098,7 +1102,7 @@ import java.util.Date
1098
1102
import java.text.SimpleDateFormat
1099
1103
1100
1104
object DateAsLongSerializer : KSerializer<Date> {
1101
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Date ", PrimitiveKind.LONG)
1105
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("my.app.DateAsLong ", PrimitiveKind.LONG)
1102
1106
override fun serialize(encoder: Encoder, value: Date) = encoder.encodeLong(value.time)
1103
1107
override fun deserialize(decoder: Decoder): Date = Date(decoder.decodeLong())
1104
1108
}
0 commit comments