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 encodeToListnull21fun <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 encodeToListnull28inline 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 decodeFromListnull50fun <T> decodeFromList(list: List<Any>, deserializer: DeserializationStrategy<T>): T { 51 val decoder = ListDecoder(ArrayDeque(list)) 52 return decoder.decodeSerializableValue(deserializer) 53 } 54 55 @ExperimentalSerializationApi decodeFromListnull56inline 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