1*57b5a4a6SAndroid Build Coastguard Worker // This file was automatically generated from formats.md by Knit tool. Do not edit.
2*57b5a4a6SAndroid Build Coastguard Worker package example.exampleFormats16
3*57b5a4a6SAndroid Build Coastguard Worker
4*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.*
5*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.Serializable
6*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.descriptors.*
7*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.modules.*
8*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.encoding.*
9*57b5a4a6SAndroid Build Coastguard Worker import java.io.*
10*57b5a4a6SAndroid Build Coastguard Worker
11*57b5a4a6SAndroid Build Coastguard Worker private val byteArraySerializer = serializer<ByteArray>()
12*57b5a4a6SAndroid Build Coastguard Worker class DataOutputEncoder(val output: DataOutput) : AbstractEncoder() {
13*57b5a4a6SAndroid Build Coastguard Worker override val serializersModule: SerializersModule = EmptySerializersModule()
encodeBooleannull14*57b5a4a6SAndroid Build Coastguard Worker override fun encodeBoolean(value: Boolean) = output.writeByte(if (value) 1 else 0)
15*57b5a4a6SAndroid Build Coastguard Worker override fun encodeByte(value: Byte) = output.writeByte(value.toInt())
16*57b5a4a6SAndroid Build Coastguard Worker override fun encodeShort(value: Short) = output.writeShort(value.toInt())
17*57b5a4a6SAndroid Build Coastguard Worker override fun encodeInt(value: Int) = output.writeInt(value)
18*57b5a4a6SAndroid Build Coastguard Worker override fun encodeLong(value: Long) = output.writeLong(value)
19*57b5a4a6SAndroid Build Coastguard Worker override fun encodeFloat(value: Float) = output.writeFloat(value)
20*57b5a4a6SAndroid Build Coastguard Worker override fun encodeDouble(value: Double) = output.writeDouble(value)
21*57b5a4a6SAndroid Build Coastguard Worker override fun encodeChar(value: Char) = output.writeChar(value.code)
22*57b5a4a6SAndroid Build Coastguard Worker override fun encodeString(value: String) = output.writeUTF(value)
23*57b5a4a6SAndroid Build Coastguard Worker override fun encodeEnum(enumDescriptor: SerialDescriptor, index: Int) = output.writeInt(index)
24*57b5a4a6SAndroid Build Coastguard Worker
25*57b5a4a6SAndroid Build Coastguard Worker override fun beginCollection(descriptor: SerialDescriptor, collectionSize: Int): CompositeEncoder {
26*57b5a4a6SAndroid Build Coastguard Worker encodeInt(collectionSize)
27*57b5a4a6SAndroid Build Coastguard Worker return this
28*57b5a4a6SAndroid Build Coastguard Worker }
29*57b5a4a6SAndroid Build Coastguard Worker
encodeNullnull30*57b5a4a6SAndroid Build Coastguard Worker override fun encodeNull() = encodeBoolean(false)
31*57b5a4a6SAndroid Build Coastguard Worker override fun encodeNotNullMark() = encodeBoolean(true)
32*57b5a4a6SAndroid Build Coastguard Worker
33*57b5a4a6SAndroid Build Coastguard Worker override fun <T> encodeSerializableValue(serializer: SerializationStrategy<T>, value: T) {
34*57b5a4a6SAndroid Build Coastguard Worker if (serializer.descriptor == byteArraySerializer.descriptor)
35*57b5a4a6SAndroid Build Coastguard Worker encodeByteArray(value as ByteArray)
36*57b5a4a6SAndroid Build Coastguard Worker else
37*57b5a4a6SAndroid Build Coastguard Worker super.encodeSerializableValue(serializer, value)
38*57b5a4a6SAndroid Build Coastguard Worker }
39*57b5a4a6SAndroid Build Coastguard Worker
encodeByteArraynull40*57b5a4a6SAndroid Build Coastguard Worker private fun encodeByteArray(bytes: ByteArray) {
41*57b5a4a6SAndroid Build Coastguard Worker encodeCompactSize(bytes.size)
42*57b5a4a6SAndroid Build Coastguard Worker output.write(bytes)
43*57b5a4a6SAndroid Build Coastguard Worker }
44*57b5a4a6SAndroid Build Coastguard Worker
encodeCompactSizenull45*57b5a4a6SAndroid Build Coastguard Worker private fun encodeCompactSize(value: Int) {
46*57b5a4a6SAndroid Build Coastguard Worker if (value < 0xff) {
47*57b5a4a6SAndroid Build Coastguard Worker output.writeByte(value)
48*57b5a4a6SAndroid Build Coastguard Worker } else {
49*57b5a4a6SAndroid Build Coastguard Worker output.writeByte(0xff)
50*57b5a4a6SAndroid Build Coastguard Worker output.writeInt(value)
51*57b5a4a6SAndroid Build Coastguard Worker }
52*57b5a4a6SAndroid Build Coastguard Worker }
53*57b5a4a6SAndroid Build Coastguard Worker }
54*57b5a4a6SAndroid Build Coastguard Worker
encodeTonull55*57b5a4a6SAndroid Build Coastguard Worker fun <T> encodeTo(output: DataOutput, serializer: SerializationStrategy<T>, value: T) {
56*57b5a4a6SAndroid Build Coastguard Worker val encoder = DataOutputEncoder(output)
57*57b5a4a6SAndroid Build Coastguard Worker encoder.encodeSerializableValue(serializer, value)
58*57b5a4a6SAndroid Build Coastguard Worker }
59*57b5a4a6SAndroid Build Coastguard Worker
encodeTonull60*57b5a4a6SAndroid Build Coastguard Worker inline fun <reified T> encodeTo(output: DataOutput, value: T) = encodeTo(output, serializer(), value)
61*57b5a4a6SAndroid Build Coastguard Worker
62*57b5a4a6SAndroid Build Coastguard Worker class DataInputDecoder(val input: DataInput, var elementsCount: Int = 0) : AbstractDecoder() {
63*57b5a4a6SAndroid Build Coastguard Worker private var elementIndex = 0
64*57b5a4a6SAndroid Build Coastguard Worker override val serializersModule: SerializersModule = EmptySerializersModule()
65*57b5a4a6SAndroid Build Coastguard Worker override fun decodeBoolean(): Boolean = input.readByte().toInt() != 0
66*57b5a4a6SAndroid Build Coastguard Worker override fun decodeByte(): Byte = input.readByte()
67*57b5a4a6SAndroid Build Coastguard Worker override fun decodeShort(): Short = input.readShort()
68*57b5a4a6SAndroid Build Coastguard Worker override fun decodeInt(): Int = input.readInt()
69*57b5a4a6SAndroid Build Coastguard Worker override fun decodeLong(): Long = input.readLong()
70*57b5a4a6SAndroid Build Coastguard Worker override fun decodeFloat(): Float = input.readFloat()
71*57b5a4a6SAndroid Build Coastguard Worker override fun decodeDouble(): Double = input.readDouble()
72*57b5a4a6SAndroid Build Coastguard Worker override fun decodeChar(): Char = input.readChar()
73*57b5a4a6SAndroid Build Coastguard Worker override fun decodeString(): String = input.readUTF()
74*57b5a4a6SAndroid Build Coastguard Worker override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = input.readInt()
75*57b5a4a6SAndroid Build Coastguard Worker
76*57b5a4a6SAndroid Build Coastguard Worker override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
77*57b5a4a6SAndroid Build Coastguard Worker if (elementIndex == elementsCount) return CompositeDecoder.DECODE_DONE
78*57b5a4a6SAndroid Build Coastguard Worker return elementIndex++
79*57b5a4a6SAndroid Build Coastguard Worker }
80*57b5a4a6SAndroid Build Coastguard Worker
81*57b5a4a6SAndroid Build Coastguard Worker override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder =
82*57b5a4a6SAndroid Build Coastguard Worker DataInputDecoder(input, descriptor.elementsCount)
83*57b5a4a6SAndroid Build Coastguard Worker
84*57b5a4a6SAndroid Build Coastguard Worker override fun decodeSequentially(): Boolean = true
85*57b5a4a6SAndroid Build Coastguard Worker
86*57b5a4a6SAndroid Build Coastguard Worker override fun decodeCollectionSize(descriptor: SerialDescriptor): Int =
87*57b5a4a6SAndroid Build Coastguard Worker decodeInt().also { elementsCount = it }
88*57b5a4a6SAndroid Build Coastguard Worker
89*57b5a4a6SAndroid Build Coastguard Worker override fun decodeNotNullMark(): Boolean = decodeBoolean()
90*57b5a4a6SAndroid Build Coastguard Worker
91*57b5a4a6SAndroid Build Coastguard Worker @Suppress("UNCHECKED_CAST")
92*57b5a4a6SAndroid Build Coastguard Worker override fun <T> decodeSerializableValue(deserializer: DeserializationStrategy<T>, previousValue: T?): T =
93*57b5a4a6SAndroid Build Coastguard Worker if (deserializer.descriptor == byteArraySerializer.descriptor)
94*57b5a4a6SAndroid Build Coastguard Worker decodeByteArray() as T
95*57b5a4a6SAndroid Build Coastguard Worker else
96*57b5a4a6SAndroid Build Coastguard Worker super.decodeSerializableValue(deserializer, previousValue)
97*57b5a4a6SAndroid Build Coastguard Worker
98*57b5a4a6SAndroid Build Coastguard Worker private fun decodeByteArray(): ByteArray {
99*57b5a4a6SAndroid Build Coastguard Worker val bytes = ByteArray(decodeCompactSize())
100*57b5a4a6SAndroid Build Coastguard Worker input.readFully(bytes)
101*57b5a4a6SAndroid Build Coastguard Worker return bytes
102*57b5a4a6SAndroid Build Coastguard Worker }
103*57b5a4a6SAndroid Build Coastguard Worker
104*57b5a4a6SAndroid Build Coastguard Worker private fun decodeCompactSize(): Int {
105*57b5a4a6SAndroid Build Coastguard Worker val byte = input.readByte().toInt() and 0xff
106*57b5a4a6SAndroid Build Coastguard Worker if (byte < 0xff) return byte
107*57b5a4a6SAndroid Build Coastguard Worker return input.readInt()
108*57b5a4a6SAndroid Build Coastguard Worker }
109*57b5a4a6SAndroid Build Coastguard Worker }
110*57b5a4a6SAndroid Build Coastguard Worker
decodeFromnull111*57b5a4a6SAndroid Build Coastguard Worker fun <T> decodeFrom(input: DataInput, deserializer: DeserializationStrategy<T>): T {
112*57b5a4a6SAndroid Build Coastguard Worker val decoder = DataInputDecoder(input)
113*57b5a4a6SAndroid Build Coastguard Worker return decoder.decodeSerializableValue(deserializer)
114*57b5a4a6SAndroid Build Coastguard Worker }
115*57b5a4a6SAndroid Build Coastguard Worker
decodeFromnull116*57b5a4a6SAndroid Build Coastguard Worker inline fun <reified T> decodeFrom(input: DataInput): T = decodeFrom(input, serializer())
117*57b5a4a6SAndroid Build Coastguard Worker
118*57b5a4a6SAndroid Build Coastguard Worker fun ByteArray.toAsciiHexString() = joinToString("") {
119*57b5a4a6SAndroid Build Coastguard Worker if (it in 32..127) it.toInt().toChar().toString() else
120*57b5a4a6SAndroid Build Coastguard Worker "{${it.toUByte().toString(16).padStart(2, '0').uppercase()}}"
121*57b5a4a6SAndroid Build Coastguard Worker }
122*57b5a4a6SAndroid Build Coastguard Worker
123*57b5a4a6SAndroid Build Coastguard Worker @Serializable
124*57b5a4a6SAndroid Build Coastguard Worker data class Project(val name: String, val attachment: ByteArray)
125*57b5a4a6SAndroid Build Coastguard Worker
mainnull126*57b5a4a6SAndroid Build Coastguard Worker fun main() {
127*57b5a4a6SAndroid Build Coastguard Worker val data = Project("kotlinx.serialization", byteArrayOf(0x0A, 0x0B, 0x0C, 0x0D))
128*57b5a4a6SAndroid Build Coastguard Worker val output = ByteArrayOutputStream()
129*57b5a4a6SAndroid Build Coastguard Worker encodeTo(DataOutputStream(output), data)
130*57b5a4a6SAndroid Build Coastguard Worker val bytes = output.toByteArray()
131*57b5a4a6SAndroid Build Coastguard Worker println(bytes.toAsciiHexString())
132*57b5a4a6SAndroid Build Coastguard Worker val input = ByteArrayInputStream(bytes)
133*57b5a4a6SAndroid Build Coastguard Worker val obj = decodeFrom<Project>(DataInputStream(input))
134*57b5a4a6SAndroid Build Coastguard Worker println(obj)
135*57b5a4a6SAndroid Build Coastguard Worker }
136