• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 package kotlinx.serialization.features
6 
7 import kotlinx.serialization.*
8 import kotlinx.serialization.descriptors.*
9 import kotlinx.serialization.encoding.*
10 import kotlinx.serialization.json.Json
11 import kotlin.test.Test
12 import kotlin.test.assertEquals
13 
14 object MultiplyingIntSerializer : KSerializer<Int> {
15     override val descriptor: SerialDescriptor
16         get() = PrimitiveSerialDescriptor("MultiplyingInt", PrimitiveKind.INT)
17 
deserializenull18     override fun deserialize(decoder: Decoder): Int {
19         return decoder.decodeInt() / 2
20     }
21 
serializenull22     override fun serialize(encoder: Encoder, value: Int) {
23         encoder.encodeInt(value * 2)
24     }
25 }
26 
27 object DividingIntSerializer : KSerializer<Int> {
28     override val descriptor: SerialDescriptor
29         get() = PrimitiveSerialDescriptor("DividedInt", PrimitiveKind.INT)
30 
deserializenull31     override fun deserialize(decoder: Decoder): Int {
32         return decoder.decodeInt() * 2
33     }
34 
serializenull35     override fun serialize(encoder: Encoder, value: Int) {
36         encoder.encodeInt(value / 2)
37     }
38 }
39 
40 @Serializable(with = DividingIntHolderSerializer::class)
41 data class IntHolder(val data: Int)
42 
43 @Serializer(IntHolder::class)
44 object MultiplyingIntHolderSerializer {
deserializenull45     override fun deserialize(decoder: Decoder): IntHolder {
46         return IntHolder(decoder.decodeInt() / 2)
47     }
48 
serializenull49     override fun serialize(encoder: Encoder, value: IntHolder) {
50         encoder.encodeInt(value.data * 2)
51     }
52 }
53 
54 @Serializer(IntHolder::class)
55 object DividingIntHolderSerializer {
deserializenull56     override fun deserialize(decoder: Decoder): IntHolder {
57         return IntHolder(decoder.decodeInt() * 2)
58     }
59 
serializenull60     override fun serialize(encoder: Encoder, value: IntHolder) {
61         encoder.encodeInt(value.data / 2)
62     }
63 }
64 
65 @Serializable
66 data class Carrier(
67     @Serializable(with = MultiplyingIntHolderSerializer::class) val a: IntHolder,
68     @Serializable(with = MultiplyingIntSerializer::class) val i: Int
69 )
70 
71 class SerializableWithTest {
72     @Test
testOnPropertiesnull73     fun testOnProperties() {
74         val str = Json.encodeToString(Carrier.serializer(), Carrier(IntHolder(42), 2))
75         assertEquals("""{"a":84,"i":4}""", str)
76     }
77 }
78