1*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST_NAME BuiltinClassesTest --> 2*57b5a4a6SAndroid Build Coastguard Worker 3*57b5a4a6SAndroid Build Coastguard Worker# Builtin classes 4*57b5a4a6SAndroid Build Coastguard Worker 5*57b5a4a6SAndroid Build Coastguard WorkerThis is the second chapter of the [Kotlin Serialization Guide](serialization-guide.md). 6*57b5a4a6SAndroid Build Coastguard WorkerIn addition to all the primitive types and strings, serialization for some classes from the Kotlin standard library, 7*57b5a4a6SAndroid Build Coastguard Workerincluding the standard collections, is built into Kotlin Serialization. This chapter explains the details. 8*57b5a4a6SAndroid Build Coastguard Worker 9*57b5a4a6SAndroid Build Coastguard Worker**Table of contents** 10*57b5a4a6SAndroid Build Coastguard Worker 11*57b5a4a6SAndroid Build Coastguard Worker<!--- TOC --> 12*57b5a4a6SAndroid Build Coastguard Worker 13*57b5a4a6SAndroid Build Coastguard Worker* [Primitives](#primitives) 14*57b5a4a6SAndroid Build Coastguard Worker * [Numbers](#numbers) 15*57b5a4a6SAndroid Build Coastguard Worker * [Long numbers](#long-numbers) 16*57b5a4a6SAndroid Build Coastguard Worker * [Long numbers as strings](#long-numbers-as-strings) 17*57b5a4a6SAndroid Build Coastguard Worker * [Enum classes](#enum-classes) 18*57b5a4a6SAndroid Build Coastguard Worker * [Serial names of enum entries](#serial-names-of-enum-entries) 19*57b5a4a6SAndroid Build Coastguard Worker* [Composites](#composites) 20*57b5a4a6SAndroid Build Coastguard Worker * [Pair and triple](#pair-and-triple) 21*57b5a4a6SAndroid Build Coastguard Worker * [Lists](#lists) 22*57b5a4a6SAndroid Build Coastguard Worker * [Sets and other collections](#sets-and-other-collections) 23*57b5a4a6SAndroid Build Coastguard Worker * [Deserializing collections](#deserializing-collections) 24*57b5a4a6SAndroid Build Coastguard Worker * [Maps](#maps) 25*57b5a4a6SAndroid Build Coastguard Worker * [Unit and singleton objects](#unit-and-singleton-objects) 26*57b5a4a6SAndroid Build Coastguard Worker * [Duration](#duration) 27*57b5a4a6SAndroid Build Coastguard Worker* [Nothing](#nothing) 28*57b5a4a6SAndroid Build Coastguard Worker 29*57b5a4a6SAndroid Build Coastguard Worker<!--- END --> 30*57b5a4a6SAndroid Build Coastguard Worker 31*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE .*-builtin-.* 32*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.* 33*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.json.* 34*57b5a4a6SAndroid Build Coastguard Worker--> 35*57b5a4a6SAndroid Build Coastguard Worker 36*57b5a4a6SAndroid Build Coastguard Worker## Primitives 37*57b5a4a6SAndroid Build Coastguard Worker 38*57b5a4a6SAndroid Build Coastguard WorkerKotlin Serialization has the following ten primitives: 39*57b5a4a6SAndroid Build Coastguard Worker`Boolean`, `Byte`, `Short`, `Int`, `Long`, `Float`, `Double`, `Char`, `String`, and enums. 40*57b5a4a6SAndroid Build Coastguard WorkerThe other types in Kotlin Serialization are _composite_—composed of those primitive values. 41*57b5a4a6SAndroid Build Coastguard Worker 42*57b5a4a6SAndroid Build Coastguard Worker### Numbers 43*57b5a4a6SAndroid Build Coastguard Worker 44*57b5a4a6SAndroid Build Coastguard WorkerAll types of integer and floating-point Kotlin numbers can be serialized. 45*57b5a4a6SAndroid Build Coastguard Worker 46*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE 47*57b5a4a6SAndroid Build Coastguard Workerimport kotlin.math.* 48*57b5a4a6SAndroid Build Coastguard Worker--> 49*57b5a4a6SAndroid Build Coastguard Worker 50*57b5a4a6SAndroid Build Coastguard Worker```kotlin 51*57b5a4a6SAndroid Build Coastguard Worker@Serializable 52*57b5a4a6SAndroid Build Coastguard Workerclass Data( 53*57b5a4a6SAndroid Build Coastguard Worker val answer: Int, 54*57b5a4a6SAndroid Build Coastguard Worker val pi: Double 55*57b5a4a6SAndroid Build Coastguard Worker) 56*57b5a4a6SAndroid Build Coastguard Worker 57*57b5a4a6SAndroid Build Coastguard Workerfun main() { 58*57b5a4a6SAndroid Build Coastguard Worker val data = Data(42, PI) 59*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(data)) 60*57b5a4a6SAndroid Build Coastguard Worker} 61*57b5a4a6SAndroid Build Coastguard Worker``` 62*57b5a4a6SAndroid Build Coastguard Worker 63*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-01.kt). 64*57b5a4a6SAndroid Build Coastguard Worker 65*57b5a4a6SAndroid Build Coastguard WorkerTheir natural representation in JSON is used. 66*57b5a4a6SAndroid Build Coastguard Worker 67*57b5a4a6SAndroid Build Coastguard Worker```text 68*57b5a4a6SAndroid Build Coastguard Worker{"answer":42,"pi":3.141592653589793} 69*57b5a4a6SAndroid Build Coastguard Worker``` 70*57b5a4a6SAndroid Build Coastguard Worker 71*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 72*57b5a4a6SAndroid Build Coastguard Worker 73*57b5a4a6SAndroid Build Coastguard Worker 74*57b5a4a6SAndroid Build Coastguard Worker### Long numbers 75*57b5a4a6SAndroid Build Coastguard Worker 76*57b5a4a6SAndroid Build Coastguard WorkerLong integers are serializable, too. 77*57b5a4a6SAndroid Build Coastguard Worker 78*57b5a4a6SAndroid Build Coastguard Worker```kotlin 79*57b5a4a6SAndroid Build Coastguard Worker@Serializable 80*57b5a4a6SAndroid Build Coastguard Workerclass Data(val signature: Long) 81*57b5a4a6SAndroid Build Coastguard Worker 82*57b5a4a6SAndroid Build Coastguard Workerfun main() { 83*57b5a4a6SAndroid Build Coastguard Worker val data = Data(0x1CAFE2FEED0BABE0) 84*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(data)) 85*57b5a4a6SAndroid Build Coastguard Worker} 86*57b5a4a6SAndroid Build Coastguard Worker``` 87*57b5a4a6SAndroid Build Coastguard Worker 88*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-02.kt). 89*57b5a4a6SAndroid Build Coastguard Worker 90*57b5a4a6SAndroid Build Coastguard WorkerBy default they are serialized to JSON as numbers. 91*57b5a4a6SAndroid Build Coastguard Worker 92*57b5a4a6SAndroid Build Coastguard Worker```text 93*57b5a4a6SAndroid Build Coastguard Worker{"signature":2067120338512882656} 94*57b5a4a6SAndroid Build Coastguard Worker``` 95*57b5a4a6SAndroid Build Coastguard Worker 96*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 97*57b5a4a6SAndroid Build Coastguard Worker 98*57b5a4a6SAndroid Build Coastguard Worker### Long numbers as strings 99*57b5a4a6SAndroid Build Coastguard Worker 100*57b5a4a6SAndroid Build Coastguard WorkerThe JSON output from the previous example will get decoded normally by Kotlin Serialization running on Kotlin/JS. 101*57b5a4a6SAndroid Build Coastguard WorkerHowever, if we try to parse this JSON by native JavaScript methods, we get this truncated result. 102*57b5a4a6SAndroid Build Coastguard Worker 103*57b5a4a6SAndroid Build Coastguard Worker``` 104*57b5a4a6SAndroid Build Coastguard WorkerJSON.parse("{\"signature\":2067120338512882656}") 105*57b5a4a6SAndroid Build Coastguard Worker▶ {signature: 2067120338512882700} 106*57b5a4a6SAndroid Build Coastguard Worker``` 107*57b5a4a6SAndroid Build Coastguard Worker 108*57b5a4a6SAndroid Build Coastguard WorkerThe full range of a Kotlin Long does not fit in the JavaScript number, so its precision gets lost in JavaScript. 109*57b5a4a6SAndroid Build Coastguard WorkerA common workaround is to represent long numbers with full precision using the JSON string type. 110*57b5a4a6SAndroid Build Coastguard WorkerThis approach is optionally supported by Kotlin Serialization with [LongAsStringSerializer], which 111*57b5a4a6SAndroid Build Coastguard Workercan be specified for a given Long property using the [`@Serializable`][Serializable] annotation: 112*57b5a4a6SAndroid Build Coastguard Worker 113*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE 114*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.builtins.* 115*57b5a4a6SAndroid Build Coastguard Worker--> 116*57b5a4a6SAndroid Build Coastguard Worker 117*57b5a4a6SAndroid Build Coastguard Worker```kotlin 118*57b5a4a6SAndroid Build Coastguard Worker@Serializable 119*57b5a4a6SAndroid Build Coastguard Workerclass Data( 120*57b5a4a6SAndroid Build Coastguard Worker @Serializable(with=LongAsStringSerializer::class) 121*57b5a4a6SAndroid Build Coastguard Worker val signature: Long 122*57b5a4a6SAndroid Build Coastguard Worker) 123*57b5a4a6SAndroid Build Coastguard Worker 124*57b5a4a6SAndroid Build Coastguard Workerfun main() { 125*57b5a4a6SAndroid Build Coastguard Worker val data = Data(0x1CAFE2FEED0BABE0) 126*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(data)) 127*57b5a4a6SAndroid Build Coastguard Worker} 128*57b5a4a6SAndroid Build Coastguard Worker``` 129*57b5a4a6SAndroid Build Coastguard Worker 130*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-03.kt). 131*57b5a4a6SAndroid Build Coastguard Worker 132*57b5a4a6SAndroid Build Coastguard WorkerThis JSON gets parsed natively by JavaScript without loss of precision. 133*57b5a4a6SAndroid Build Coastguard Worker 134*57b5a4a6SAndroid Build Coastguard Worker```text 135*57b5a4a6SAndroid Build Coastguard Worker{"signature":"2067120338512882656"} 136*57b5a4a6SAndroid Build Coastguard Worker``` 137*57b5a4a6SAndroid Build Coastguard Worker 138*57b5a4a6SAndroid Build Coastguard Worker> The section on [Specifying serializers for a file](serializers.md#specifying-serializers-for-a-file) explains how a 139*57b5a4a6SAndroid Build Coastguard Worker> serializer like `LongAsStringSerializer` can be specified for all properties in a file. 140*57b5a4a6SAndroid Build Coastguard Worker 141*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 142*57b5a4a6SAndroid Build Coastguard Worker 143*57b5a4a6SAndroid Build Coastguard Worker### Enum classes 144*57b5a4a6SAndroid Build Coastguard Worker 145*57b5a4a6SAndroid Build Coastguard WorkerAll enum classes are serializable out of the box without having to mark them `@Serializable`, 146*57b5a4a6SAndroid Build Coastguard Workeras the following example shows. 147*57b5a4a6SAndroid Build Coastguard Worker 148*57b5a4a6SAndroid Build Coastguard Worker```kotlin 149*57b5a4a6SAndroid Build Coastguard Worker// The @Serializable annotation is not needed for enum classes 150*57b5a4a6SAndroid Build Coastguard Workerenum class Status { SUPPORTED } 151*57b5a4a6SAndroid Build Coastguard Worker 152*57b5a4a6SAndroid Build Coastguard Worker@Serializable 153*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String, val status: Status) 154*57b5a4a6SAndroid Build Coastguard Worker 155*57b5a4a6SAndroid Build Coastguard Workerfun main() { 156*57b5a4a6SAndroid Build Coastguard Worker val data = Project("kotlinx.serialization", Status.SUPPORTED) 157*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(data)) 158*57b5a4a6SAndroid Build Coastguard Worker} 159*57b5a4a6SAndroid Build Coastguard Worker``` 160*57b5a4a6SAndroid Build Coastguard Worker 161*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-04.kt). 162*57b5a4a6SAndroid Build Coastguard Worker 163*57b5a4a6SAndroid Build Coastguard WorkerIn JSON an enum gets encoded as a string. 164*57b5a4a6SAndroid Build Coastguard Worker 165*57b5a4a6SAndroid Build Coastguard Worker```text 166*57b5a4a6SAndroid Build Coastguard Worker{"name":"kotlinx.serialization","status":"SUPPORTED"} 167*57b5a4a6SAndroid Build Coastguard Worker``` 168*57b5a4a6SAndroid Build Coastguard Worker 169*57b5a4a6SAndroid Build Coastguard Worker> Note: On Kotlin/JS and Kotlin/Native, `@Serializable` annotation is needed for enum class if you want to use it as a root object — i.e. use `encodeToString<Status>(Status.SUPPORTED)`. 170*57b5a4a6SAndroid Build Coastguard Worker 171*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 172*57b5a4a6SAndroid Build Coastguard Worker 173*57b5a4a6SAndroid Build Coastguard Worker### Serial names of enum entries 174*57b5a4a6SAndroid Build Coastguard Worker 175*57b5a4a6SAndroid Build Coastguard WorkerSerial names of enum entries can be customized with the [SerialName] annotation just like 176*57b5a4a6SAndroid Build Coastguard Workerit was shown for properties in the [Serial field names](basic-serialization.md#serial-field-names) section. 177*57b5a4a6SAndroid Build Coastguard WorkerHowever, in this case, the whole enum class must be marked with the [`@Serializable`][Serializable] annotation. 178*57b5a4a6SAndroid Build Coastguard Worker 179*57b5a4a6SAndroid Build Coastguard Worker```kotlin 180*57b5a4a6SAndroid Build Coastguard Worker@Serializable // required because of @SerialName 181*57b5a4a6SAndroid Build Coastguard Workerenum class Status { @SerialName("maintained") SUPPORTED } 182*57b5a4a6SAndroid Build Coastguard Worker 183*57b5a4a6SAndroid Build Coastguard Worker@Serializable 184*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String, val status: Status) 185*57b5a4a6SAndroid Build Coastguard Worker 186*57b5a4a6SAndroid Build Coastguard Workerfun main() { 187*57b5a4a6SAndroid Build Coastguard Worker val data = Project("kotlinx.serialization", Status.SUPPORTED) 188*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(data)) 189*57b5a4a6SAndroid Build Coastguard Worker} 190*57b5a4a6SAndroid Build Coastguard Worker``` 191*57b5a4a6SAndroid Build Coastguard Worker 192*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-05.kt). 193*57b5a4a6SAndroid Build Coastguard Worker 194*57b5a4a6SAndroid Build Coastguard WorkerWe see that the specified serial name is now used in the resulting JSON. 195*57b5a4a6SAndroid Build Coastguard Worker 196*57b5a4a6SAndroid Build Coastguard Worker```text 197*57b5a4a6SAndroid Build Coastguard Worker{"name":"kotlinx.serialization","status":"maintained"} 198*57b5a4a6SAndroid Build Coastguard Worker``` 199*57b5a4a6SAndroid Build Coastguard Worker 200*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 201*57b5a4a6SAndroid Build Coastguard Worker 202*57b5a4a6SAndroid Build Coastguard Worker## Composites 203*57b5a4a6SAndroid Build Coastguard Worker 204*57b5a4a6SAndroid Build Coastguard WorkerA number of composite types from the standard library are supported by Kotlin Serialization. 205*57b5a4a6SAndroid Build Coastguard Worker 206*57b5a4a6SAndroid Build Coastguard Worker### Pair and triple 207*57b5a4a6SAndroid Build Coastguard Worker 208*57b5a4a6SAndroid Build Coastguard WorkerThe simple data classes [Pair] and [Triple] from the Kotlin standard library are serializable. 209*57b5a4a6SAndroid Build Coastguard Worker 210*57b5a4a6SAndroid Build Coastguard Worker```kotlin 211*57b5a4a6SAndroid Build Coastguard Worker@Serializable 212*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String) 213*57b5a4a6SAndroid Build Coastguard Worker 214*57b5a4a6SAndroid Build Coastguard Workerfun main() { 215*57b5a4a6SAndroid Build Coastguard Worker val pair = 1 to Project("kotlinx.serialization") 216*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(pair)) 217*57b5a4a6SAndroid Build Coastguard Worker} 218*57b5a4a6SAndroid Build Coastguard Worker``` 219*57b5a4a6SAndroid Build Coastguard Worker 220*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-06.kt). 221*57b5a4a6SAndroid Build Coastguard Worker 222*57b5a4a6SAndroid Build Coastguard Worker```text 223*57b5a4a6SAndroid Build Coastguard Worker{"first":1,"second":{"name":"kotlinx.serialization"}} 224*57b5a4a6SAndroid Build Coastguard Worker``` 225*57b5a4a6SAndroid Build Coastguard Worker 226*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 227*57b5a4a6SAndroid Build Coastguard Worker 228*57b5a4a6SAndroid Build Coastguard Worker> Not all classes from the Kotlin standard library are serializable. In particular, ranges and the [Regex] class 229*57b5a4a6SAndroid Build Coastguard Worker> are not serializable at the moment. Support for their serialization may be added in the future. 230*57b5a4a6SAndroid Build Coastguard Worker 231*57b5a4a6SAndroid Build Coastguard Worker### Lists 232*57b5a4a6SAndroid Build Coastguard Worker 233*57b5a4a6SAndroid Build Coastguard WorkerA [List] of serializable classes can be serialized. 234*57b5a4a6SAndroid Build Coastguard Worker 235*57b5a4a6SAndroid Build Coastguard Worker```kotlin 236*57b5a4a6SAndroid Build Coastguard Worker@Serializable 237*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String) 238*57b5a4a6SAndroid Build Coastguard Worker 239*57b5a4a6SAndroid Build Coastguard Workerfun main() { 240*57b5a4a6SAndroid Build Coastguard Worker val list = listOf( 241*57b5a4a6SAndroid Build Coastguard Worker Project("kotlinx.serialization"), 242*57b5a4a6SAndroid Build Coastguard Worker Project("kotlinx.coroutines") 243*57b5a4a6SAndroid Build Coastguard Worker ) 244*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(list)) 245*57b5a4a6SAndroid Build Coastguard Worker} 246*57b5a4a6SAndroid Build Coastguard Worker``` 247*57b5a4a6SAndroid Build Coastguard Worker 248*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-07.kt). 249*57b5a4a6SAndroid Build Coastguard Worker 250*57b5a4a6SAndroid Build Coastguard WorkerThe result is represented as a list in JSON. 251*57b5a4a6SAndroid Build Coastguard Worker 252*57b5a4a6SAndroid Build Coastguard Worker```text 253*57b5a4a6SAndroid Build Coastguard Worker[{"name":"kotlinx.serialization"},{"name":"kotlinx.coroutines"}] 254*57b5a4a6SAndroid Build Coastguard Worker``` 255*57b5a4a6SAndroid Build Coastguard Worker 256*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 257*57b5a4a6SAndroid Build Coastguard Worker 258*57b5a4a6SAndroid Build Coastguard Worker### Sets and other collections 259*57b5a4a6SAndroid Build Coastguard Worker 260*57b5a4a6SAndroid Build Coastguard WorkerOther collections, like [Set], are also serializable. 261*57b5a4a6SAndroid Build Coastguard Worker 262*57b5a4a6SAndroid Build Coastguard Worker```kotlin 263*57b5a4a6SAndroid Build Coastguard Worker@Serializable 264*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String) 265*57b5a4a6SAndroid Build Coastguard Worker 266*57b5a4a6SAndroid Build Coastguard Workerfun main() { 267*57b5a4a6SAndroid Build Coastguard Worker val set = setOf( 268*57b5a4a6SAndroid Build Coastguard Worker Project("kotlinx.serialization"), 269*57b5a4a6SAndroid Build Coastguard Worker Project("kotlinx.coroutines") 270*57b5a4a6SAndroid Build Coastguard Worker ) 271*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(set)) 272*57b5a4a6SAndroid Build Coastguard Worker} 273*57b5a4a6SAndroid Build Coastguard Worker``` 274*57b5a4a6SAndroid Build Coastguard Worker 275*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-08.kt). 276*57b5a4a6SAndroid Build Coastguard Worker 277*57b5a4a6SAndroid Build Coastguard Worker[Set] is also represented as a list in JSON, like all other collections. 278*57b5a4a6SAndroid Build Coastguard Worker 279*57b5a4a6SAndroid Build Coastguard Worker```text 280*57b5a4a6SAndroid Build Coastguard Worker[{"name":"kotlinx.serialization"},{"name":"kotlinx.coroutines"}] 281*57b5a4a6SAndroid Build Coastguard Worker``` 282*57b5a4a6SAndroid Build Coastguard Worker 283*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 284*57b5a4a6SAndroid Build Coastguard Worker 285*57b5a4a6SAndroid Build Coastguard Worker### Deserializing collections 286*57b5a4a6SAndroid Build Coastguard Worker 287*57b5a4a6SAndroid Build Coastguard WorkerDuring deserialization, the type of the resulting object is determined by the static type that was specified 288*57b5a4a6SAndroid Build Coastguard Workerin the source code—either as the type of the property or as the type parameter of the decoding function. 289*57b5a4a6SAndroid Build Coastguard WorkerThe following example shows how the same JSON list of integers is deserialized into two properties of 290*57b5a4a6SAndroid Build Coastguard Workerdifferent Kotlin types. 291*57b5a4a6SAndroid Build Coastguard Worker 292*57b5a4a6SAndroid Build Coastguard Worker```kotlin 293*57b5a4a6SAndroid Build Coastguard Worker@Serializable 294*57b5a4a6SAndroid Build Coastguard Workerdata class Data( 295*57b5a4a6SAndroid Build Coastguard Worker val a: List<Int>, 296*57b5a4a6SAndroid Build Coastguard Worker val b: Set<Int> 297*57b5a4a6SAndroid Build Coastguard Worker) 298*57b5a4a6SAndroid Build Coastguard Worker 299*57b5a4a6SAndroid Build Coastguard Workerfun main() { 300*57b5a4a6SAndroid Build Coastguard Worker val data = Json.decodeFromString<Data>(""" 301*57b5a4a6SAndroid Build Coastguard Worker { 302*57b5a4a6SAndroid Build Coastguard Worker "a": [42, 42], 303*57b5a4a6SAndroid Build Coastguard Worker "b": [42, 42] 304*57b5a4a6SAndroid Build Coastguard Worker } 305*57b5a4a6SAndroid Build Coastguard Worker """) 306*57b5a4a6SAndroid Build Coastguard Worker println(data) 307*57b5a4a6SAndroid Build Coastguard Worker} 308*57b5a4a6SAndroid Build Coastguard Worker``` 309*57b5a4a6SAndroid Build Coastguard Worker 310*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-09.kt). 311*57b5a4a6SAndroid Build Coastguard Worker 312*57b5a4a6SAndroid Build Coastguard WorkerBecause the `data.b` property is a [Set], the duplicate values from it disappeared. 313*57b5a4a6SAndroid Build Coastguard Worker 314*57b5a4a6SAndroid Build Coastguard Worker```text 315*57b5a4a6SAndroid Build Coastguard WorkerData(a=[42, 42], b=[42]) 316*57b5a4a6SAndroid Build Coastguard Worker``` 317*57b5a4a6SAndroid Build Coastguard Worker 318*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 319*57b5a4a6SAndroid Build Coastguard Worker 320*57b5a4a6SAndroid Build Coastguard Worker### Maps 321*57b5a4a6SAndroid Build Coastguard Worker 322*57b5a4a6SAndroid Build Coastguard WorkerA [Map] with primitive or enum keys and arbitrary serializable values can be serialized. 323*57b5a4a6SAndroid Build Coastguard Worker 324*57b5a4a6SAndroid Build Coastguard Worker```kotlin 325*57b5a4a6SAndroid Build Coastguard Worker@Serializable 326*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String) 327*57b5a4a6SAndroid Build Coastguard Worker 328*57b5a4a6SAndroid Build Coastguard Workerfun main() { 329*57b5a4a6SAndroid Build Coastguard Worker val map = mapOf( 330*57b5a4a6SAndroid Build Coastguard Worker 1 to Project("kotlinx.serialization"), 331*57b5a4a6SAndroid Build Coastguard Worker 2 to Project("kotlinx.coroutines") 332*57b5a4a6SAndroid Build Coastguard Worker ) 333*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(map)) 334*57b5a4a6SAndroid Build Coastguard Worker} 335*57b5a4a6SAndroid Build Coastguard Worker``` 336*57b5a4a6SAndroid Build Coastguard Worker 337*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-10.kt). 338*57b5a4a6SAndroid Build Coastguard Worker 339*57b5a4a6SAndroid Build Coastguard WorkerKotlin maps in JSON are represented as objects. In JSON object keys are always strings, so keys are encoded as strings 340*57b5a4a6SAndroid Build Coastguard Workereven if they are numbers in Kotlin, as we can see below. 341*57b5a4a6SAndroid Build Coastguard Worker 342*57b5a4a6SAndroid Build Coastguard Worker```text 343*57b5a4a6SAndroid Build Coastguard Worker{"1":{"name":"kotlinx.serialization"},"2":{"name":"kotlinx.coroutines"}} 344*57b5a4a6SAndroid Build Coastguard Worker``` 345*57b5a4a6SAndroid Build Coastguard Worker 346*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 347*57b5a4a6SAndroid Build Coastguard Worker 348*57b5a4a6SAndroid Build Coastguard Worker> It is a JSON-specific limitation that keys cannot be composite. 349*57b5a4a6SAndroid Build Coastguard Worker> It can be lifted as shown in the [Allowing structured map keys](json.md#allowing-structured-map-keys) section. 350*57b5a4a6SAndroid Build Coastguard Worker 351*57b5a4a6SAndroid Build Coastguard Worker 352*57b5a4a6SAndroid Build Coastguard Worker### Unit and singleton objects 353*57b5a4a6SAndroid Build Coastguard Worker 354*57b5a4a6SAndroid Build Coastguard WorkerThe Kotlin builtin `Unit` type is also serializable. 355*57b5a4a6SAndroid Build Coastguard Worker`Unit` is a Kotlin [singleton object](https://kotlinlang.org/docs/tutorials/kotlin-for-py/objects-and-companion-objects.html), 356*57b5a4a6SAndroid Build Coastguard Workerand is handled equally with other Kotlin objects. 357*57b5a4a6SAndroid Build Coastguard Worker 358*57b5a4a6SAndroid Build Coastguard WorkerConceptually, a singleton is a class with only one instance, meaning that state does not define the object, 359*57b5a4a6SAndroid Build Coastguard Workerbut the object defines its state. In JSON, objects are serialized as empty structures. 360*57b5a4a6SAndroid Build Coastguard Worker 361*57b5a4a6SAndroid Build Coastguard Worker```kotlin 362*57b5a4a6SAndroid Build Coastguard Worker@Serializable 363*57b5a4a6SAndroid Build Coastguard Workerobject SerializationVersion { 364*57b5a4a6SAndroid Build Coastguard Worker val libraryVersion: String = "1.0.0" 365*57b5a4a6SAndroid Build Coastguard Worker} 366*57b5a4a6SAndroid Build Coastguard Worker 367*57b5a4a6SAndroid Build Coastguard Workerfun main() { 368*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(SerializationVersion)) 369*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(Unit)) 370*57b5a4a6SAndroid Build Coastguard Worker} 371*57b5a4a6SAndroid Build Coastguard Worker``` 372*57b5a4a6SAndroid Build Coastguard Worker 373*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-11.kt). 374*57b5a4a6SAndroid Build Coastguard Worker 375*57b5a4a6SAndroid Build Coastguard WorkerWhile it may seem useless at first glance, this comes in handy for sealed class serialization, 376*57b5a4a6SAndroid Build Coastguard Workerwhich is explained in the [Polymorphism. Objects](polymorphism.md#objects) section. 377*57b5a4a6SAndroid Build Coastguard Worker 378*57b5a4a6SAndroid Build Coastguard Worker```text 379*57b5a4a6SAndroid Build Coastguard Worker{} 380*57b5a4a6SAndroid Build Coastguard Worker{} 381*57b5a4a6SAndroid Build Coastguard Worker``` 382*57b5a4a6SAndroid Build Coastguard Worker 383*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 384*57b5a4a6SAndroid Build Coastguard Worker 385*57b5a4a6SAndroid Build Coastguard Worker> Serialization of objects is format specific. Other formats may represent objects differently, 386*57b5a4a6SAndroid Build Coastguard Worker> e.g. using their fully-qualified names. 387*57b5a4a6SAndroid Build Coastguard Worker 388*57b5a4a6SAndroid Build Coastguard Worker### Duration 389*57b5a4a6SAndroid Build Coastguard Worker 390*57b5a4a6SAndroid Build Coastguard WorkerSince Kotlin `1.7.20` the [Duration] class has become serializable. 391*57b5a4a6SAndroid Build Coastguard Worker 392*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE 393*57b5a4a6SAndroid Build Coastguard Workerimport kotlin.time.* 394*57b5a4a6SAndroid Build Coastguard Worker--> 395*57b5a4a6SAndroid Build Coastguard Worker 396*57b5a4a6SAndroid Build Coastguard Worker```kotlin 397*57b5a4a6SAndroid Build Coastguard Workerfun main() { 398*57b5a4a6SAndroid Build Coastguard Worker val duration = 1000.toDuration(DurationUnit.SECONDS) 399*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(duration)) 400*57b5a4a6SAndroid Build Coastguard Worker} 401*57b5a4a6SAndroid Build Coastguard Worker``` 402*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-12.kt). 403*57b5a4a6SAndroid Build Coastguard Worker 404*57b5a4a6SAndroid Build Coastguard WorkerDuration is serialized as a string in the ISO-8601-2 format. 405*57b5a4a6SAndroid Build Coastguard Worker```text 406*57b5a4a6SAndroid Build Coastguard Worker"PT16M40S" 407*57b5a4a6SAndroid Build Coastguard Worker``` 408*57b5a4a6SAndroid Build Coastguard Worker 409*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 410*57b5a4a6SAndroid Build Coastguard Worker 411*57b5a4a6SAndroid Build Coastguard Worker 412*57b5a4a6SAndroid Build Coastguard Worker## Nothing 413*57b5a4a6SAndroid Build Coastguard Worker 414*57b5a4a6SAndroid Build Coastguard WorkerBy default, [Nothing] is a serializable class. However, since there are no instances of this class, it is impossible to encode or decode its values - any attempt will cause an exception. 415*57b5a4a6SAndroid Build Coastguard Worker 416*57b5a4a6SAndroid Build Coastguard WorkerThis serializer is used when syntactically some type is needed, but it is not actually used in serialization. For example, when using parameterized polymorphic base classes: 417*57b5a4a6SAndroid Build Coastguard Worker```kotlin 418*57b5a4a6SAndroid Build Coastguard Worker@Serializable 419*57b5a4a6SAndroid Build Coastguard Workersealed class ParametrizedParent<out R> { 420*57b5a4a6SAndroid Build Coastguard Worker @Serializable 421*57b5a4a6SAndroid Build Coastguard Worker data class ChildWithoutParameter(val value: Int) : ParametrizedParent<Nothing>() 422*57b5a4a6SAndroid Build Coastguard Worker} 423*57b5a4a6SAndroid Build Coastguard Worker 424*57b5a4a6SAndroid Build Coastguard Workerfun main() { 425*57b5a4a6SAndroid Build Coastguard Worker println(Json.encodeToString(ParametrizedParent.ChildWithoutParameter(42))) 426*57b5a4a6SAndroid Build Coastguard Worker} 427*57b5a4a6SAndroid Build Coastguard Worker``` 428*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-13.kt). 429*57b5a4a6SAndroid Build Coastguard Worker 430*57b5a4a6SAndroid Build Coastguard WorkerWhen encoding, the serializer for the `Nothing` was not used 431*57b5a4a6SAndroid Build Coastguard Worker 432*57b5a4a6SAndroid Build Coastguard Worker```text 433*57b5a4a6SAndroid Build Coastguard Worker{"value":42} 434*57b5a4a6SAndroid Build Coastguard Worker``` 435*57b5a4a6SAndroid Build Coastguard Worker 436*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST --> 437*57b5a4a6SAndroid Build Coastguard Worker 438*57b5a4a6SAndroid Build Coastguard Worker--- 439*57b5a4a6SAndroid Build Coastguard Worker 440*57b5a4a6SAndroid Build Coastguard WorkerThe next chapter covers [Serializers](serializers.md). 441*57b5a4a6SAndroid Build Coastguard Worker 442*57b5a4a6SAndroid Build Coastguard Worker<!-- stdlib references --> 443*57b5a4a6SAndroid Build Coastguard Worker[Double.NaN]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/-na-n.html 444*57b5a4a6SAndroid Build Coastguard Worker[Pair]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/ 445*57b5a4a6SAndroid Build Coastguard Worker[Triple]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-triple/ 446*57b5a4a6SAndroid Build Coastguard Worker[Regex]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/ 447*57b5a4a6SAndroid Build Coastguard Worker[List]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/ 448*57b5a4a6SAndroid Build Coastguard Worker[Set]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/ 449*57b5a4a6SAndroid Build Coastguard Worker[Map]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/ 450*57b5a4a6SAndroid Build Coastguard Worker[Duration]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/ 451*57b5a4a6SAndroid Build Coastguard Worker[Nothing]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-nothing.html 452*57b5a4a6SAndroid Build Coastguard Worker 453*57b5a4a6SAndroid Build Coastguard Worker<!--- MODULE /kotlinx-serialization-core --> 454*57b5a4a6SAndroid Build Coastguard Worker<!--- INDEX kotlinx-serialization-core/kotlinx.serialization --> 455*57b5a4a6SAndroid Build Coastguard Worker 456*57b5a4a6SAndroid Build Coastguard Worker[Serializable]: https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-serializable/index.html 457*57b5a4a6SAndroid Build Coastguard Worker[SerialName]: https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-serial-name/index.html 458*57b5a4a6SAndroid Build Coastguard Worker 459*57b5a4a6SAndroid Build Coastguard Worker<!--- MODULE /kotlinx-serialization-core --> 460*57b5a4a6SAndroid Build Coastguard Worker<!--- INDEX kotlinx-serialization-core/kotlinx.serialization.builtins --> 461*57b5a4a6SAndroid Build Coastguard Worker 462*57b5a4a6SAndroid Build Coastguard Worker[LongAsStringSerializer]: https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization.builtins/-long-as-string-serializer/index.html 463*57b5a4a6SAndroid Build Coastguard Worker 464*57b5a4a6SAndroid Build Coastguard Worker<!--- END --> 465