• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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