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.Serializable
6 import kotlinx.serialization.descriptors.*
7 import kotlinx.serialization.encoding.*
8 import kotlinx.serialization.modules.*
9 import java.io.*
10
11 class DataOutputEncoder(val output: DataOutput) : AbstractEncoder() {
12 override val serializersModule: SerializersModule = EmptySerializersModule()
encodeBooleannull13 override fun encodeBoolean(value: Boolean) = output.writeByte(if (value) 1 else 0)
14 override fun encodeByte(value: Byte) = output.writeByte(value.toInt())
15 override fun encodeShort(value: Short) = output.writeShort(value.toInt())
16 override fun encodeInt(value: Int) = output.writeInt(value)
17 override fun encodeLong(value: Long) = output.writeLong(value)
18 override fun encodeFloat(value: Float) = output.writeFloat(value)
19 override fun encodeDouble(value: Double) = output.writeDouble(value)
20 override fun encodeChar(value: Char) = output.writeChar(value.code)
21 override fun encodeString(value: String) = output.writeUTF(value)
22 override fun encodeEnum(enumDescriptor: SerialDescriptor, index: Int) = output.writeInt(index)
23
24 override fun beginCollection(descriptor: SerialDescriptor, collectionSize: Int): CompositeEncoder {
25 encodeInt(collectionSize)
26 return this
27 }
28
encodeNullnull29 override fun encodeNull() = encodeBoolean(false)
30 override fun encodeNotNullMark() = encodeBoolean(true)
31 }
32
33 fun <T> encodeTo(output: DataOutput, serializer: SerializationStrategy<T>, value: T) {
34 val encoder = DataOutputEncoder(output)
35 encoder.encodeSerializableValue(serializer, value)
36 }
37
encodeTonull38 inline fun <reified T> encodeTo(output: DataOutput, value: T) = encodeTo(output, serializer(), value)
39
40 class DataInputDecoder(val input: DataInput, var elementsCount: Int = 0) : AbstractDecoder() {
41 private var elementIndex = 0
42 override val serializersModule: SerializersModule = EmptySerializersModule()
43 override fun decodeBoolean(): Boolean = input.readByte().toInt() != 0
44 override fun decodeByte(): Byte = input.readByte()
45 override fun decodeShort(): Short = input.readShort()
46 override fun decodeInt(): Int = input.readInt()
47 override fun decodeLong(): Long = input.readLong()
48 override fun decodeFloat(): Float = input.readFloat()
49 override fun decodeDouble(): Double = input.readDouble()
50 override fun decodeChar(): Char = input.readChar()
51 override fun decodeString(): String = input.readUTF()
52 override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = input.readInt()
53
54 override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
55 if (elementIndex == elementsCount) return CompositeDecoder.DECODE_DONE
56 return elementIndex++
57 }
58
59 override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder =
60 DataInputDecoder(input, descriptor.elementsCount)
61
62 override fun decodeSequentially(): Boolean = true
63
64 override fun decodeCollectionSize(descriptor: SerialDescriptor): Int =
65 decodeInt().also { elementsCount = it }
66
67 override fun decodeNotNullMark(): Boolean = decodeBoolean()
68 }
69
decodeFromnull70 fun <T> decodeFrom(input: DataInput, deserializer: DeserializationStrategy<T>): T {
71 val decoder = DataInputDecoder(input)
72 return decoder.decodeSerializableValue(deserializer)
73 }
74
decodeFromnull75 inline fun <reified T> decodeFrom(input: DataInput): T = decodeFrom(input, serializer())
76
77 fun ByteArray.toAsciiHexString() = joinToString("") {
78 if (it in 32..127) it.toInt().toChar().toString() else
79 "{${it.toUByte().toString(16).padStart(2, '0').uppercase()}}"
80 }
81
82 @Serializable
83 data class Project(val name: String, val language: String)
84
mainnull85 fun main() {
86 val data = Project("kotlinx.serialization", "Kotlin")
87 val output = ByteArrayOutputStream()
88 encodeTo(DataOutputStream(output), data)
89 val bytes = output.toByteArray()
90 println(bytes.toAsciiHexString())
91 val input = ByteArrayInputStream(bytes)
92 val obj = decodeFrom<Project>(DataInputStream(input))
93 println(obj)
94 }
95