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