xref: /aosp_15_r20/external/kotlinx.serialization/guide/example/example-serializer-13.kt (revision 57b5a4a64c534cf7f27ac9427ceab07f3d8ed3d8)
1*57b5a4a6SAndroid Build Coastguard Worker // This file was automatically generated from serializers.md by Knit tool. Do not edit.
2*57b5a4a6SAndroid Build Coastguard Worker package example.exampleSerializer13
3*57b5a4a6SAndroid Build Coastguard Worker 
4*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.*
5*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.json.*
6*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.encoding.*
7*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.descriptors.*
8*57b5a4a6SAndroid Build Coastguard Worker 
9*57b5a4a6SAndroid Build Coastguard Worker object ColorAsObjectSerializer : KSerializer<Color> {
10*57b5a4a6SAndroid Build Coastguard Worker 
11*57b5a4a6SAndroid Build Coastguard Worker     override val descriptor: SerialDescriptor =
<lambda>null12*57b5a4a6SAndroid Build Coastguard Worker         buildClassSerialDescriptor("Color") {
13*57b5a4a6SAndroid Build Coastguard Worker             element<Int>("r")
14*57b5a4a6SAndroid Build Coastguard Worker             element<Int>("g")
15*57b5a4a6SAndroid Build Coastguard Worker             element<Int>("b")
16*57b5a4a6SAndroid Build Coastguard Worker         }
17*57b5a4a6SAndroid Build Coastguard Worker 
serializenull18*57b5a4a6SAndroid Build Coastguard Worker     override fun serialize(encoder: Encoder, value: Color) =
19*57b5a4a6SAndroid Build Coastguard Worker         encoder.encodeStructure(descriptor) {
20*57b5a4a6SAndroid Build Coastguard Worker             encodeIntElement(descriptor, 0, (value.rgb shr 16) and 0xff)
21*57b5a4a6SAndroid Build Coastguard Worker             encodeIntElement(descriptor, 1, (value.rgb shr 8) and 0xff)
22*57b5a4a6SAndroid Build Coastguard Worker             encodeIntElement(descriptor, 2, value.rgb and 0xff)
23*57b5a4a6SAndroid Build Coastguard Worker         }
24*57b5a4a6SAndroid Build Coastguard Worker 
deserializenull25*57b5a4a6SAndroid Build Coastguard Worker     override fun deserialize(decoder: Decoder): Color =
26*57b5a4a6SAndroid Build Coastguard Worker         decoder.decodeStructure(descriptor) {
27*57b5a4a6SAndroid Build Coastguard Worker             var r = -1
28*57b5a4a6SAndroid Build Coastguard Worker             var g = -1
29*57b5a4a6SAndroid Build Coastguard Worker             var b = -1
30*57b5a4a6SAndroid Build Coastguard Worker             if (decodeSequentially()) { // sequential decoding protocol
31*57b5a4a6SAndroid Build Coastguard Worker                 r = decodeIntElement(descriptor, 0)
32*57b5a4a6SAndroid Build Coastguard Worker                 g = decodeIntElement(descriptor, 1)
33*57b5a4a6SAndroid Build Coastguard Worker                 b = decodeIntElement(descriptor, 2)
34*57b5a4a6SAndroid Build Coastguard Worker             } else while (true) {
35*57b5a4a6SAndroid Build Coastguard Worker                 when (val index = decodeElementIndex(descriptor)) {
36*57b5a4a6SAndroid Build Coastguard Worker                     0 -> r = decodeIntElement(descriptor, 0)
37*57b5a4a6SAndroid Build Coastguard Worker                     1 -> g = decodeIntElement(descriptor, 1)
38*57b5a4a6SAndroid Build Coastguard Worker                     2 -> b = decodeIntElement(descriptor, 2)
39*57b5a4a6SAndroid Build Coastguard Worker                     CompositeDecoder.DECODE_DONE -> break
40*57b5a4a6SAndroid Build Coastguard Worker                     else -> error("Unexpected index: $index")
41*57b5a4a6SAndroid Build Coastguard Worker                 }
42*57b5a4a6SAndroid Build Coastguard Worker             }
43*57b5a4a6SAndroid Build Coastguard Worker             require(r in 0..255 && g in 0..255 && b in 0..255)
44*57b5a4a6SAndroid Build Coastguard Worker             Color((r shl 16) or (g shl 8) or b)
45*57b5a4a6SAndroid Build Coastguard Worker         }
46*57b5a4a6SAndroid Build Coastguard Worker }
47*57b5a4a6SAndroid Build Coastguard Worker 
48*57b5a4a6SAndroid Build Coastguard Worker @Serializable(with = ColorAsObjectSerializer::class)
49*57b5a4a6SAndroid Build Coastguard Worker data class Color(val rgb: Int)
50*57b5a4a6SAndroid Build Coastguard Worker 
mainnull51*57b5a4a6SAndroid Build Coastguard Worker fun main() {
52*57b5a4a6SAndroid Build Coastguard Worker     val color = Color(0x00ff00)
53*57b5a4a6SAndroid Build Coastguard Worker     val string = Json.encodeToString(color)
54*57b5a4a6SAndroid Build Coastguard Worker     println(string)
55*57b5a4a6SAndroid Build Coastguard Worker     require(Json.decodeFromString<Color>(string) == color)
56*57b5a4a6SAndroid Build Coastguard Worker }
57