xref: /aosp_15_r20/external/kotlinx.serialization/guide/example/example-poly-20.kt (revision 57b5a4a64c534cf7f27ac9427ceab07f3d8ed3d8)

<lambda>null1*57b5a4a6SAndroid Build Coastguard Worker // This file was automatically generated from polymorphism.md by Knit tool. Do not edit.
2*57b5a4a6SAndroid Build Coastguard Worker package example.examplePoly20
3*57b5a4a6SAndroid Build Coastguard Worker 
4*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.*
5*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.json.*
6*57b5a4a6SAndroid Build Coastguard Worker 
7*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.descriptors.*
8*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.encoding.*
9*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.modules.*
10*57b5a4a6SAndroid Build Coastguard Worker 
11*57b5a4a6SAndroid Build Coastguard Worker interface Animal {
12*57b5a4a6SAndroid Build Coastguard Worker }
13*57b5a4a6SAndroid Build Coastguard Worker 
14*57b5a4a6SAndroid Build Coastguard Worker interface Cat : Animal {
15*57b5a4a6SAndroid Build Coastguard Worker     val catType: String
16*57b5a4a6SAndroid Build Coastguard Worker }
17*57b5a4a6SAndroid Build Coastguard Worker 
18*57b5a4a6SAndroid Build Coastguard Worker interface Dog : Animal {
19*57b5a4a6SAndroid Build Coastguard Worker     val dogType: String
20*57b5a4a6SAndroid Build Coastguard Worker }
21*57b5a4a6SAndroid Build Coastguard Worker 
22*57b5a4a6SAndroid Build Coastguard Worker private class CatImpl : Cat {
23*57b5a4a6SAndroid Build Coastguard Worker     override val catType: String = "Tabby"
24*57b5a4a6SAndroid Build Coastguard Worker }
25*57b5a4a6SAndroid Build Coastguard Worker 
26*57b5a4a6SAndroid Build Coastguard Worker private class DogImpl : Dog {
27*57b5a4a6SAndroid Build Coastguard Worker     override val dogType: String = "Husky"
28*57b5a4a6SAndroid Build Coastguard Worker }
29*57b5a4a6SAndroid Build Coastguard Worker 
30*57b5a4a6SAndroid Build Coastguard Worker object AnimalProvider {
createCatnull31*57b5a4a6SAndroid Build Coastguard Worker     fun createCat(): Cat = CatImpl()
32*57b5a4a6SAndroid Build Coastguard Worker     fun createDog(): Dog = DogImpl()
33*57b5a4a6SAndroid Build Coastguard Worker }
34*57b5a4a6SAndroid Build Coastguard Worker 
35*57b5a4a6SAndroid Build Coastguard Worker val module = SerializersModule {
36*57b5a4a6SAndroid Build Coastguard Worker     polymorphicDefaultSerializer(Animal::class) { instance ->
37*57b5a4a6SAndroid Build Coastguard Worker         @Suppress("UNCHECKED_CAST")
38*57b5a4a6SAndroid Build Coastguard Worker         when (instance) {
39*57b5a4a6SAndroid Build Coastguard Worker             is Cat -> CatSerializer as SerializationStrategy<Animal>
40*57b5a4a6SAndroid Build Coastguard Worker             is Dog -> DogSerializer as SerializationStrategy<Animal>
41*57b5a4a6SAndroid Build Coastguard Worker             else -> null
42*57b5a4a6SAndroid Build Coastguard Worker         }
43*57b5a4a6SAndroid Build Coastguard Worker     }
44*57b5a4a6SAndroid Build Coastguard Worker }
45*57b5a4a6SAndroid Build Coastguard Worker 
46*57b5a4a6SAndroid Build Coastguard Worker object CatSerializer : SerializationStrategy<Cat> {
<lambda>null47*57b5a4a6SAndroid Build Coastguard Worker     override val descriptor = buildClassSerialDescriptor("Cat") {
48*57b5a4a6SAndroid Build Coastguard Worker         element<String>("catType")
49*57b5a4a6SAndroid Build Coastguard Worker     }
50*57b5a4a6SAndroid Build Coastguard Worker 
serializenull51*57b5a4a6SAndroid Build Coastguard Worker     override fun serialize(encoder: Encoder, value: Cat) {
52*57b5a4a6SAndroid Build Coastguard Worker         encoder.encodeStructure(descriptor) {
53*57b5a4a6SAndroid Build Coastguard Worker           encodeStringElement(descriptor, 0, value.catType)
54*57b5a4a6SAndroid Build Coastguard Worker         }
55*57b5a4a6SAndroid Build Coastguard Worker     }
56*57b5a4a6SAndroid Build Coastguard Worker }
57*57b5a4a6SAndroid Build Coastguard Worker 
58*57b5a4a6SAndroid Build Coastguard Worker object DogSerializer : SerializationStrategy<Dog> {
<lambda>null59*57b5a4a6SAndroid Build Coastguard Worker   override val descriptor = buildClassSerialDescriptor("Dog") {
60*57b5a4a6SAndroid Build Coastguard Worker     element<String>("dogType")
61*57b5a4a6SAndroid Build Coastguard Worker   }
62*57b5a4a6SAndroid Build Coastguard Worker 
serializenull63*57b5a4a6SAndroid Build Coastguard Worker   override fun serialize(encoder: Encoder, value: Dog) {
64*57b5a4a6SAndroid Build Coastguard Worker     encoder.encodeStructure(descriptor) {
65*57b5a4a6SAndroid Build Coastguard Worker       encodeStringElement(descriptor, 0, value.dogType)
66*57b5a4a6SAndroid Build Coastguard Worker     }
67*57b5a4a6SAndroid Build Coastguard Worker   }
68*57b5a4a6SAndroid Build Coastguard Worker }
69*57b5a4a6SAndroid Build Coastguard Worker 
<lambda>null70*57b5a4a6SAndroid Build Coastguard Worker val format = Json { serializersModule = module }
71*57b5a4a6SAndroid Build Coastguard Worker 
mainnull72*57b5a4a6SAndroid Build Coastguard Worker fun main() {
73*57b5a4a6SAndroid Build Coastguard Worker     println(format.encodeToString<Animal>(AnimalProvider.createCat()))
74*57b5a4a6SAndroid Build Coastguard Worker }
75