|
| 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 | + |
| 25 | + 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 | + |
| 31 | + override fun deserialize(decoder: Decoder): Message { |
| 32 | + return SimpleMessage(decoder.decodeString()) |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + @Test |
| 37 | + 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 | +} |
0 commit comments