• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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