xref: /aosp_15_r20/external/kotlinx.serialization/guide/example/example-formats-14.kt (revision 57b5a4a64c534cf7f27ac9427ceab07f3d8ed3d8)
1 // This file was automatically generated from formats.md by Knit tool. Do not edit.
2 package example.exampleFormats14
3 
4 import kotlinx.serialization.*
5 import kotlinx.serialization.descriptors.*
6 import kotlinx.serialization.encoding.*
7 import kotlinx.serialization.modules.*
8 
9 class ListEncoder : AbstractEncoder() {
10     val list = mutableListOf<Any>()
11 
12     override val serializersModule: SerializersModule = EmptySerializersModule()
13 
encodeValuenull14     override fun encodeValue(value: Any) {
15         list.add(value)
16     }
17 
beginCollectionnull18     override fun beginCollection(descriptor: SerialDescriptor, collectionSize: Int): CompositeEncoder {
19         encodeInt(collectionSize)
20         return this
21     }
22 
encodeNullnull23     override fun encodeNull() = encodeValue("NULL")
24     override fun encodeNotNullMark() = encodeValue("!!")
25 }
26 
27 fun <T> encodeToList(serializer: SerializationStrategy<T>, value: T): List<Any> {
28     val encoder = ListEncoder()
29     encoder.encodeSerializableValue(serializer, value)
30     return encoder.list
31 }
32 
encodeToListnull33 inline fun <reified T> encodeToList(value: T) = encodeToList(serializer(), value)
34 
35 class ListDecoder(val list: ArrayDeque<Any>, var elementsCount: Int = 0) : AbstractDecoder() {
36     private var elementIndex = 0
37 
38     override val serializersModule: SerializersModule = EmptySerializersModule()
39 
40     override fun decodeValue(): Any = list.removeFirst()
41 
42     override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
43         if (elementIndex == elementsCount) return CompositeDecoder.DECODE_DONE
44         return elementIndex++
45     }
46 
47     override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder =
48         ListDecoder(list, descriptor.elementsCount)
49 
50     override fun decodeSequentially(): Boolean = true
51 
52     override fun decodeCollectionSize(descriptor: SerialDescriptor): Int =
53         decodeInt().also { elementsCount = it }
54 
55     override fun decodeNotNullMark(): Boolean = decodeString() != "NULL"
56 }
57 
decodeFromListnull58 fun <T> decodeFromList(list: List<Any>, deserializer: DeserializationStrategy<T>): T {
59     val decoder = ListDecoder(ArrayDeque(list))
60     return decoder.decodeSerializableValue(deserializer)
61 }
62 
decodeFromListnull63 inline fun <reified T> decodeFromList(list: List<Any>): T = decodeFromList(list, serializer())
64 
65 @Serializable
66 data class Project(val name: String, val owner: User?, val votes: Int?)
67 
68 @Serializable
69 data class User(val name: String)
70 
71 fun main() {
72     val data = Project("kotlinx.serialization",  User("kotlin") , null)
73     val list = encodeToList(data)
74     println(list)
75     val obj = decodeFromList<Project>(list)
76     println(obj)
77 }
78 
79