1 package kotlinx.serialization.features 2 3 import kotlin.test.* 4 import kotlinx.serialization.* 5 import kotlinx.serialization.descriptors.* 6 import kotlinx.serialization.encoding.* 7 import kotlinx.serialization.json.* 8 import kotlinx.serialization.modules.* 9 10 class DerivedContextualSerializerTest { 11 12 @Serializable 13 abstract class Message 14 15 @Serializable 16 class SimpleMessage(val body: String) : Message() 17 18 @Serializable 19 class Holder(@Contextual val message: Message) 20 21 object MessageAsStringSerializer : KSerializer<Message> { 22 override val descriptor: SerialDescriptor = 23 PrimitiveSerialDescriptor("kotlinx.serialization.MessageAsStringSerializer", PrimitiveKind.STRING) 24 serializenull25 override fun serialize(encoder: Encoder, value: Message) { 26 // dummy serializer that assumes Message is always SimpleMessage 27 check(value is SimpleMessage) 28 encoder.encodeString(value.body) 29 } 30 deserializenull31 override fun deserialize(decoder: Decoder): Message { 32 return SimpleMessage(decoder.decodeString()) 33 } 34 } 35 36 @Test testDerivedContextualSerializernull37 fun testDerivedContextualSerializer() { 38 val module = SerializersModule { 39 contextual(MessageAsStringSerializer) 40 } 41 val format = Json { serializersModule = module } 42 val data = Holder(SimpleMessage("hello")) 43 val serialized = format.encodeToString(data) 44 assertEquals("""{"message":"hello"}""", serialized) 45 val deserialized = format.decodeFromString<Holder>(serialized) 46 assertTrue(deserialized.message is SimpleMessage) 47 assertEquals("hello", deserialized.message.body) 48 } 49 } 50