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 @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 }
24
25 @ExperimentalSerializationApi
encodeToListnull26 fun <T> encodeToList(serializer: SerializationStrategy<T>, value: T): List<Any> {
27 val encoder = ListEncoder()
28 encoder.encodeSerializableValue(serializer, value)
29 return encoder.list
30 }
31
32 @ExperimentalSerializationApi
encodeToListnull33 inline fun <reified T> encodeToList(value: T) = encodeToList(serializer(), value)
34
35 @ExperimentalSerializationApi
36 class ListDecoder(val list: ArrayDeque<Any>, var elementsCount: Int = 0) : AbstractDecoder() {
37 private var elementIndex = 0
38
39 override val serializersModule: SerializersModule = EmptySerializersModule()
40
41 override fun decodeValue(): Any = list.removeFirst()
42
43 override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
44 if (elementIndex == elementsCount) return CompositeDecoder.DECODE_DONE
45 return elementIndex++
46 }
47
48 override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder =
49 ListDecoder(list, descriptor.elementsCount)
50
51 override fun decodeSequentially(): Boolean = true
52
53 override fun decodeCollectionSize(descriptor: SerialDescriptor): Int =
54 decodeInt().also { elementsCount = it }
55 }
56
57 @ExperimentalSerializationApi
decodeFromListnull58 fun <T> decodeFromList(list: List<Any>, deserializer: DeserializationStrategy<T>): T {
59 val decoder = ListDecoder(ArrayDeque(list))
60 return decoder.decodeSerializableValue(deserializer)
61 }
62
63 @ExperimentalSerializationApi
decodeFromListnull64 inline fun <reified T> decodeFromList(list: List<Any>): T = decodeFromList(list, serializer())
65
66 @Serializable
67 data class Project(val name: String, val owners: List<User>, val votes: Int)
68
69 @Serializable
70 data class User(val name: String)
71
72 @OptIn(ExperimentalSerializationApi::class)
73 fun main() {
74 val data = Project("kotlinx.serialization", listOf(User("kotlin"), User("jetbrains")), 9000)
75 val list = encodeToList(data)
76 println(list)
77 val obj = decodeFromList<Project>(list)
78 println(obj)
79 }
80