• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file was automatically generated from formats.md by Knit tool. Do not edit.
2 package example.exampleFormats13
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 }
19 
20 @ExperimentalSerializationApi
encodeToListnull21 fun <T> encodeToList(serializer: SerializationStrategy<T>, value: T): List<Any> {
22     val encoder = ListEncoder()
23     encoder.encodeSerializableValue(serializer, value)
24     return encoder.list
25 }
26 
27 @ExperimentalSerializationApi
encodeToListnull28 inline fun <reified T> encodeToList(value: T) = encodeToList(serializer(), value)
29 
30 @ExperimentalSerializationApi
31 class ListDecoder(val list: ArrayDeque<Any>) : AbstractDecoder() {
32     private var elementIndex = 0
33 
34     override val serializersModule: SerializersModule = EmptySerializersModule()
35 
36     override fun decodeValue(): Any = list.removeFirst()
37 
38     override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
39         if (elementIndex == descriptor.elementsCount) return CompositeDecoder.DECODE_DONE
40         return elementIndex++
41     }
42 
43     override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder =
44         ListDecoder(list)
45 
46     override fun decodeSequentially(): Boolean = true
47 }
48 
49 @ExperimentalSerializationApi
decodeFromListnull50 fun <T> decodeFromList(list: List<Any>, deserializer: DeserializationStrategy<T>): T {
51     val decoder = ListDecoder(ArrayDeque(list))
52     return decoder.decodeSerializableValue(deserializer)
53 }
54 
55 @ExperimentalSerializationApi
decodeFromListnull56 inline fun <reified T> decodeFromList(list: List<Any>): T = decodeFromList(list, serializer())
57 
58 @Serializable
59 data class Project(val name: String, val owner: User, val votes: Int)
60 
61 @Serializable
62 data class User(val name: String)
63 
64 @OptIn(ExperimentalSerializationApi::class)
65 fun main() {
66     val data = Project("kotlinx.serialization",  User("kotlin"), 9000)
67     val list = encodeToList(data)
68     println(list)
69     val obj = decodeFromList<Project>(list)
70     println(obj)
71 }
72