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