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