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