xref: /aosp_15_r20/external/kotlinx.serialization/README.md (revision 57b5a4a64c534cf7f27ac9427ceab07f3d8ed3d8)
1*57b5a4a6SAndroid Build Coastguard Worker# Kotlin multiplatform / multi-format reflectionless serialization
2*57b5a4a6SAndroid Build Coastguard Worker
3*57b5a4a6SAndroid Build Coastguard Worker[![Kotlin Stable](https://kotl.in/badges/stable.svg)](https://kotlinlang.org/docs/components-stability.html)
4*57b5a4a6SAndroid Build Coastguard Worker[![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
5*57b5a4a6SAndroid Build Coastguard Worker[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0)
6*57b5a4a6SAndroid Build Coastguard Worker[![TeamCity build](https://img.shields.io/teamcity/http/teamcity.jetbrains.com/s/KotlinTools_KotlinxSerialization_Ko.svg)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=KotlinTools_KotlinxSerialization_Ko&guest=1)
7*57b5a4a6SAndroid Build Coastguard Worker[![Kotlin](https://img.shields.io/badge/kotlin-1.9.22-blue.svg?logo=kotlin)](http://kotlinlang.org)
8*57b5a4a6SAndroid Build Coastguard Worker[![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-serialization-core/1.6.3)](https://central.sonatype.com/artifact/org.jetbrains.kotlinx/kotlinx-serialization-core/1.6.3)
9*57b5a4a6SAndroid Build Coastguard Worker[![KDoc link](https://img.shields.io/badge/API_reference-KDoc-blue)](https://kotlinlang.org/api/kotlinx.serialization/)
10*57b5a4a6SAndroid Build Coastguard Worker[![Slack channel](https://img.shields.io/badge/chat-slack-blue.svg?logo=slack)](https://kotlinlang.slack.com/messages/serialization/)
11*57b5a4a6SAndroid Build Coastguard Worker
12*57b5a4a6SAndroid Build Coastguard WorkerKotlin serialization consists of a compiler plugin, that generates visitor code for serializable classes,
13*57b5a4a6SAndroid Build Coastguard Worker runtime library with core serialization API and support libraries with various serialization formats.
14*57b5a4a6SAndroid Build Coastguard Worker
15*57b5a4a6SAndroid Build Coastguard Worker* Supports Kotlin classes marked as `@Serializable` and standard collections.
16*57b5a4a6SAndroid Build Coastguard Worker* Provides [JSON](formats/README.md#JSON), [Protobuf](formats/README.md#ProtoBuf), [CBOR](formats/README.md#CBOR), [Hocon](formats/README.md#HOCON) and [Properties](formats/README.md#properties) formats.
17*57b5a4a6SAndroid Build Coastguard Worker* Complete multiplatform support: JVM, JS and Native.
18*57b5a4a6SAndroid Build Coastguard Worker
19*57b5a4a6SAndroid Build Coastguard Worker## Table of contents
20*57b5a4a6SAndroid Build Coastguard Worker
21*57b5a4a6SAndroid Build Coastguard Worker<!--- TOC -->
22*57b5a4a6SAndroid Build Coastguard Worker
23*57b5a4a6SAndroid Build Coastguard Worker* [Introduction and references](#introduction-and-references)
24*57b5a4a6SAndroid Build Coastguard Worker* [Setup](#setup)
25*57b5a4a6SAndroid Build Coastguard Worker  * [Gradle](#gradle)
26*57b5a4a6SAndroid Build Coastguard Worker    * [1) Setting up the serialization plugin](#1-setting-up-the-serialization-plugin)
27*57b5a4a6SAndroid Build Coastguard Worker    * [2) Dependency on the JSON library](#2-dependency-on-the-json-library)
28*57b5a4a6SAndroid Build Coastguard Worker  * [Android](#android)
29*57b5a4a6SAndroid Build Coastguard Worker  * [Multiplatform (Common, JS, Native)](#multiplatform-common-js-native)
30*57b5a4a6SAndroid Build Coastguard Worker  * [Maven](#maven)
31*57b5a4a6SAndroid Build Coastguard Worker  * [Bazel](#bazel)
32*57b5a4a6SAndroid Build Coastguard Worker
33*57b5a4a6SAndroid Build Coastguard Worker<!--- END -->
34*57b5a4a6SAndroid Build Coastguard Worker
35*57b5a4a6SAndroid Build Coastguard Worker* **Additional links**
36*57b5a4a6SAndroid Build Coastguard Worker  * [Kotlin Serialization Guide](docs/serialization-guide.md)
37*57b5a4a6SAndroid Build Coastguard Worker  * [Full API reference](https://kotlinlang.org/api/kotlinx.serialization/)
38*57b5a4a6SAndroid Build Coastguard Worker  * [Submitting issues and PRs](CONTRIBUTING.md)
39*57b5a4a6SAndroid Build Coastguard Worker  * [Building this library](docs/building.md)
40*57b5a4a6SAndroid Build Coastguard Worker
41*57b5a4a6SAndroid Build Coastguard Worker## Introduction and references
42*57b5a4a6SAndroid Build Coastguard Worker
43*57b5a4a6SAndroid Build Coastguard WorkerHere is a small example.
44*57b5a4a6SAndroid Build Coastguard Worker
45*57b5a4a6SAndroid Build Coastguard Worker```kotlin
46*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.*
47*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.json.*
48*57b5a4a6SAndroid Build Coastguard Worker
49*57b5a4a6SAndroid Build Coastguard Worker@Serializable
50*57b5a4a6SAndroid Build Coastguard Workerdata class Project(val name: String, val language: String)
51*57b5a4a6SAndroid Build Coastguard Worker
52*57b5a4a6SAndroid Build Coastguard Workerfun main() {
53*57b5a4a6SAndroid Build Coastguard Worker    // Serializing objects
54*57b5a4a6SAndroid Build Coastguard Worker    val data = Project("kotlinx.serialization", "Kotlin")
55*57b5a4a6SAndroid Build Coastguard Worker    val string = Json.encodeToString(data)
56*57b5a4a6SAndroid Build Coastguard Worker    println(string) // {"name":"kotlinx.serialization","language":"Kotlin"}
57*57b5a4a6SAndroid Build Coastguard Worker    // Deserializing back into objects
58*57b5a4a6SAndroid Build Coastguard Worker    val obj = Json.decodeFromString<Project>(string)
59*57b5a4a6SAndroid Build Coastguard Worker    println(obj) // Project(name=kotlinx.serialization, language=Kotlin)
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-readme-01.kt).
64*57b5a4a6SAndroid Build Coastguard Worker
65*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST_NAME ReadmeTest -->
66*57b5a4a6SAndroid Build Coastguard Worker
67*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST
68*57b5a4a6SAndroid Build Coastguard Worker{"name":"kotlinx.serialization","language":"Kotlin"}
69*57b5a4a6SAndroid Build Coastguard WorkerProject(name=kotlinx.serialization, language=Kotlin)
70*57b5a4a6SAndroid Build Coastguard Worker-->
71*57b5a4a6SAndroid Build Coastguard Worker
72*57b5a4a6SAndroid Build Coastguard Worker**Read the [Kotlin Serialization Guide](docs/serialization-guide.md) for all details.**
73*57b5a4a6SAndroid Build Coastguard Worker
74*57b5a4a6SAndroid Build Coastguard WorkerYou can find auto-generated documentation website on [kotlinlang.org](https://kotlinlang.org/api/kotlinx.serialization/).
75*57b5a4a6SAndroid Build Coastguard Worker
76*57b5a4a6SAndroid Build Coastguard Worker## Setup
77*57b5a4a6SAndroid Build Coastguard Worker
78*57b5a4a6SAndroid Build Coastguard Worker[New versions](https://plugins.gradle.org/plugin/org.jetbrains.kotlin.plugin.serialization) of the serialization plugin are released in tandem with each new Kotlin compiler version.
79*57b5a4a6SAndroid Build Coastguard Worker
80*57b5a4a6SAndroid Build Coastguard WorkerUsing Kotlin Serialization requires Kotlin compiler `1.4.0` or higher.
81*57b5a4a6SAndroid Build Coastguard WorkerMake sure you have the corresponding Kotlin plugin installed in the IDE, no additional plugins for IDE are required.
82*57b5a4a6SAndroid Build Coastguard Worker
83*57b5a4a6SAndroid Build Coastguard Worker### Gradle
84*57b5a4a6SAndroid Build Coastguard Worker
85*57b5a4a6SAndroid Build Coastguard WorkerTo set up kotlinx.serialization, you have to do two things:
86*57b5a4a6SAndroid Build Coastguard Worker1) Add the **[serialization plugin](#1-setting-up-the-serialization-plugin)**.
87*57b5a4a6SAndroid Build Coastguard Worker2) Add the **[serialization library dependency](#2-dependency-on-the-json-library)**.
88*57b5a4a6SAndroid Build Coastguard Worker
89*57b5a4a6SAndroid Build Coastguard Worker#### 1) Setting up the serialization plugin
90*57b5a4a6SAndroid Build Coastguard Worker
91*57b5a4a6SAndroid Build Coastguard WorkerYou can set up the serialization plugin with the Kotlin plugin using the
92*57b5a4a6SAndroid Build Coastguard Worker[Gradle plugins DSL](https://docs.gradle.org/current/userguide/plugins.html#sec:plugins_block):
93*57b5a4a6SAndroid Build Coastguard Worker
94*57b5a4a6SAndroid Build Coastguard WorkerKotlin DSL:
95*57b5a4a6SAndroid Build Coastguard Worker
96*57b5a4a6SAndroid Build Coastguard Worker```kotlin
97*57b5a4a6SAndroid Build Coastguard Workerplugins {
98*57b5a4a6SAndroid Build Coastguard Worker    kotlin("jvm") version "1.9.22" // or kotlin("multiplatform") or any other kotlin plugin
99*57b5a4a6SAndroid Build Coastguard Worker    kotlin("plugin.serialization") version "1.9.22"
100*57b5a4a6SAndroid Build Coastguard Worker}
101*57b5a4a6SAndroid Build Coastguard Worker```
102*57b5a4a6SAndroid Build Coastguard Worker
103*57b5a4a6SAndroid Build Coastguard WorkerGroovy DSL:
104*57b5a4a6SAndroid Build Coastguard Worker
105*57b5a4a6SAndroid Build Coastguard Worker```gradle
106*57b5a4a6SAndroid Build Coastguard Workerplugins {
107*57b5a4a6SAndroid Build Coastguard Worker    id 'org.jetbrains.kotlin.multiplatform' version '1.9.22'
108*57b5a4a6SAndroid Build Coastguard Worker    id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.22'
109*57b5a4a6SAndroid Build Coastguard Worker}
110*57b5a4a6SAndroid Build Coastguard Worker```
111*57b5a4a6SAndroid Build Coastguard Worker
112*57b5a4a6SAndroid Build Coastguard Worker> Kotlin versions before 1.4.0 are not supported by the stable release of Kotlin serialization.
113*57b5a4a6SAndroid Build Coastguard Worker
114*57b5a4a6SAndroid Build Coastguard Worker<details>
115*57b5a4a6SAndroid Build Coastguard Worker  <summary>Using <code>apply plugin</code> (the old way)</summary>
116*57b5a4a6SAndroid Build Coastguard Worker
117*57b5a4a6SAndroid Build Coastguard WorkerFirst, you have to add the serialization plugin to your classpath as the other [compiler plugins](https://kotlinlang.org/docs/reference/compiler-plugins.html):
118*57b5a4a6SAndroid Build Coastguard Worker
119*57b5a4a6SAndroid Build Coastguard WorkerKotlin DSL:
120*57b5a4a6SAndroid Build Coastguard Worker
121*57b5a4a6SAndroid Build Coastguard Worker```kotlin
122*57b5a4a6SAndroid Build Coastguard Workerbuildscript {
123*57b5a4a6SAndroid Build Coastguard Worker    repositories { mavenCentral() }
124*57b5a4a6SAndroid Build Coastguard Worker
125*57b5a4a6SAndroid Build Coastguard Worker    dependencies {
126*57b5a4a6SAndroid Build Coastguard Worker        val kotlinVersion = "1.9.22"
127*57b5a4a6SAndroid Build Coastguard Worker        classpath(kotlin("gradle-plugin", version = kotlinVersion))
128*57b5a4a6SAndroid Build Coastguard Worker        classpath(kotlin("serialization", version = kotlinVersion))
129*57b5a4a6SAndroid Build Coastguard Worker    }
130*57b5a4a6SAndroid Build Coastguard Worker}
131*57b5a4a6SAndroid Build Coastguard Worker```
132*57b5a4a6SAndroid Build Coastguard Worker
133*57b5a4a6SAndroid Build Coastguard WorkerGroovy DSL:
134*57b5a4a6SAndroid Build Coastguard Worker
135*57b5a4a6SAndroid Build Coastguard Worker```gradle
136*57b5a4a6SAndroid Build Coastguard Workerbuildscript {
137*57b5a4a6SAndroid Build Coastguard Worker    ext.kotlin_version = '1.9.22'
138*57b5a4a6SAndroid Build Coastguard Worker    repositories { mavenCentral() }
139*57b5a4a6SAndroid Build Coastguard Worker
140*57b5a4a6SAndroid Build Coastguard Worker    dependencies {
141*57b5a4a6SAndroid Build Coastguard Worker        classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
142*57b5a4a6SAndroid Build Coastguard Worker    }
143*57b5a4a6SAndroid Build Coastguard Worker}
144*57b5a4a6SAndroid Build Coastguard Worker```
145*57b5a4a6SAndroid Build Coastguard Worker
146*57b5a4a6SAndroid Build Coastguard WorkerThen you can `apply plugin` (example in Groovy):
147*57b5a4a6SAndroid Build Coastguard Worker
148*57b5a4a6SAndroid Build Coastguard Worker```gradle
149*57b5a4a6SAndroid Build Coastguard Workerapply plugin: 'kotlin' // or 'kotlin-multiplatform' for multiplatform projects
150*57b5a4a6SAndroid Build Coastguard Workerapply plugin: 'kotlinx-serialization'
151*57b5a4a6SAndroid Build Coastguard Worker```
152*57b5a4a6SAndroid Build Coastguard Worker</details>
153*57b5a4a6SAndroid Build Coastguard Worker
154*57b5a4a6SAndroid Build Coastguard Worker#### 2) Dependency on the JSON library
155*57b5a4a6SAndroid Build Coastguard Worker
156*57b5a4a6SAndroid Build Coastguard WorkerAfter setting up the plugin, you have to add a dependency on the serialization library.
157*57b5a4a6SAndroid Build Coastguard WorkerNote that while the plugin has version the same as the compiler one, runtime library has different coordinates, repository and versioning.
158*57b5a4a6SAndroid Build Coastguard Worker
159*57b5a4a6SAndroid Build Coastguard WorkerKotlin DSL:
160*57b5a4a6SAndroid Build Coastguard Worker
161*57b5a4a6SAndroid Build Coastguard Worker```kotlin
162*57b5a4a6SAndroid Build Coastguard Workerrepositories {
163*57b5a4a6SAndroid Build Coastguard Worker    mavenCentral()
164*57b5a4a6SAndroid Build Coastguard Worker}
165*57b5a4a6SAndroid Build Coastguard Worker
166*57b5a4a6SAndroid Build Coastguard Workerdependencies {
167*57b5a4a6SAndroid Build Coastguard Worker    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
168*57b5a4a6SAndroid Build Coastguard Worker}
169*57b5a4a6SAndroid Build Coastguard Worker```
170*57b5a4a6SAndroid Build Coastguard Worker
171*57b5a4a6SAndroid Build Coastguard WorkerGroovy DSL:
172*57b5a4a6SAndroid Build Coastguard Worker
173*57b5a4a6SAndroid Build Coastguard Worker```gradle
174*57b5a4a6SAndroid Build Coastguard Workerrepositories {
175*57b5a4a6SAndroid Build Coastguard Worker    mavenCentral()
176*57b5a4a6SAndroid Build Coastguard Worker}
177*57b5a4a6SAndroid Build Coastguard Worker
178*57b5a4a6SAndroid Build Coastguard Workerdependencies {
179*57b5a4a6SAndroid Build Coastguard Worker    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3"
180*57b5a4a6SAndroid Build Coastguard Worker}
181*57b5a4a6SAndroid Build Coastguard Worker```
182*57b5a4a6SAndroid Build Coastguard Worker
183*57b5a4a6SAndroid Build Coastguard Worker>We also provide `kotlinx-serialization-core` artifact that contains all serialization API but does not have a bundled serialization format with it
184*57b5a4a6SAndroid Build Coastguard Worker
185*57b5a4a6SAndroid Build Coastguard Worker### Android
186*57b5a4a6SAndroid Build Coastguard Worker
187*57b5a4a6SAndroid Build Coastguard WorkerBy default, proguard rules are supplied with the library.
188*57b5a4a6SAndroid Build Coastguard Worker[These rules](rules/common.pro) keep serializers for _all_ serializable classes that are retained after shrinking,
189*57b5a4a6SAndroid Build Coastguard Workerso you don't need additional setup.
190*57b5a4a6SAndroid Build Coastguard Worker
191*57b5a4a6SAndroid Build Coastguard Worker**However, these rules do not affect serializable classes if they have named companion objects.**
192*57b5a4a6SAndroid Build Coastguard Worker
193*57b5a4a6SAndroid Build Coastguard WorkerIf you want to serialize classes with named companion objects, you need to add and edit rules below to your `proguard-rules.pro` configuration.
194*57b5a4a6SAndroid Build Coastguard Worker
195*57b5a4a6SAndroid Build Coastguard WorkerNote that the rules for R8 differ depending on the [compatibility mode](https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md) used.
196*57b5a4a6SAndroid Build Coastguard Worker
197*57b5a4a6SAndroid Build Coastguard Worker<details>
198*57b5a4a6SAndroid Build Coastguard Worker<summary>Example of named companion rules for ProGuard and R8 compatibility mode</summary>
199*57b5a4a6SAndroid Build Coastguard Worker
200*57b5a4a6SAndroid Build Coastguard Worker```proguard
201*57b5a4a6SAndroid Build Coastguard Worker# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
202*57b5a4a6SAndroid Build Coastguard Worker# If you have any, replace classes with those containing named companion objects.
203*57b5a4a6SAndroid Build Coastguard Worker-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
204*57b5a4a6SAndroid Build Coastguard Worker
205*57b5a4a6SAndroid Build Coastguard Worker-if @kotlinx.serialization.Serializable class
206*57b5a4a6SAndroid Build Coastguard Workercom.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
207*57b5a4a6SAndroid Build Coastguard Workercom.example.myapplication.HasNamedCompanion2
208*57b5a4a6SAndroid Build Coastguard Worker{
209*57b5a4a6SAndroid Build Coastguard Worker    static **$* *;
210*57b5a4a6SAndroid Build Coastguard Worker}
211*57b5a4a6SAndroid Build Coastguard Worker-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
212*57b5a4a6SAndroid Build Coastguard Worker    static <1>$$serializer INSTANCE;
213*57b5a4a6SAndroid Build Coastguard Worker}
214*57b5a4a6SAndroid Build Coastguard Worker```
215*57b5a4a6SAndroid Build Coastguard Worker</details>
216*57b5a4a6SAndroid Build Coastguard Worker
217*57b5a4a6SAndroid Build Coastguard Worker
218*57b5a4a6SAndroid Build Coastguard Worker<details>
219*57b5a4a6SAndroid Build Coastguard Worker<summary>Example of named companion rules for R8 full mode</summary>
220*57b5a4a6SAndroid Build Coastguard Worker
221*57b5a4a6SAndroid Build Coastguard Worker```proguard
222*57b5a4a6SAndroid Build Coastguard Worker# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
223*57b5a4a6SAndroid Build Coastguard Worker# If you have any, replace classes with those containing named companion objects.
224*57b5a4a6SAndroid Build Coastguard Worker-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
225*57b5a4a6SAndroid Build Coastguard Worker
226*57b5a4a6SAndroid Build Coastguard Worker-if @kotlinx.serialization.Serializable class
227*57b5a4a6SAndroid Build Coastguard Workercom.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
228*57b5a4a6SAndroid Build Coastguard Workercom.example.myapplication.HasNamedCompanion2
229*57b5a4a6SAndroid Build Coastguard Worker{
230*57b5a4a6SAndroid Build Coastguard Worker    static **$* *;
231*57b5a4a6SAndroid Build Coastguard Worker}
232*57b5a4a6SAndroid Build Coastguard Worker-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
233*57b5a4a6SAndroid Build Coastguard Worker    static <1>$$serializer INSTANCE;
234*57b5a4a6SAndroid Build Coastguard Worker}
235*57b5a4a6SAndroid Build Coastguard Worker
236*57b5a4a6SAndroid Build Coastguard Worker# Keep both serializer and serializable classes to save the attribute InnerClasses
237*57b5a4a6SAndroid Build Coastguard Worker-keepclasseswithmembers, allowshrinking, allowobfuscation, allowaccessmodification class
238*57b5a4a6SAndroid Build Coastguard Workercom.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
239*57b5a4a6SAndroid Build Coastguard Workercom.example.myapplication.HasNamedCompanion2
240*57b5a4a6SAndroid Build Coastguard Worker{
241*57b5a4a6SAndroid Build Coastguard Worker    *;
242*57b5a4a6SAndroid Build Coastguard Worker}
243*57b5a4a6SAndroid Build Coastguard Worker```
244*57b5a4a6SAndroid Build Coastguard Worker</details>
245*57b5a4a6SAndroid Build Coastguard Worker
246*57b5a4a6SAndroid Build Coastguard WorkerIn case you want to exclude serializable classes that are used, but never serialized at runtime,
247*57b5a4a6SAndroid Build Coastguard Workeryou will need to write custom rules with narrower [class specifications](https://www.guardsquare.com/manual/configuration/usage).
248*57b5a4a6SAndroid Build Coastguard Worker
249*57b5a4a6SAndroid Build Coastguard Worker### Multiplatform (Common, JS, Native)
250*57b5a4a6SAndroid Build Coastguard Worker
251*57b5a4a6SAndroid Build Coastguard WorkerMost of the modules are also available for Kotlin/JS and Kotlin/Native.
252*57b5a4a6SAndroid Build Coastguard WorkerYou can add dependency to the required module right to the common source set:
253*57b5a4a6SAndroid Build Coastguard Worker```gradle
254*57b5a4a6SAndroid Build Coastguard WorkercommonMain {
255*57b5a4a6SAndroid Build Coastguard Worker    dependencies {
256*57b5a4a6SAndroid Build Coastguard Worker        // Works as common dependency as well as the platform one
257*57b5a4a6SAndroid Build Coastguard Worker        implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization_version"
258*57b5a4a6SAndroid Build Coastguard Worker    }
259*57b5a4a6SAndroid Build Coastguard Worker}
260*57b5a4a6SAndroid Build Coastguard Worker```
261*57b5a4a6SAndroid Build Coastguard WorkerThe same artifact coordinates can be used to depend on platform-specific artifact in platform-specific source-set.
262*57b5a4a6SAndroid Build Coastguard Worker
263*57b5a4a6SAndroid Build Coastguard Worker### Maven
264*57b5a4a6SAndroid Build Coastguard Worker
265*57b5a4a6SAndroid Build Coastguard WorkerEnsure the proper version of Kotlin and serialization version:
266*57b5a4a6SAndroid Build Coastguard Worker
267*57b5a4a6SAndroid Build Coastguard Worker```xml
268*57b5a4a6SAndroid Build Coastguard Worker<properties>
269*57b5a4a6SAndroid Build Coastguard Worker    <kotlin.version>1.9.22</kotlin.version>
270*57b5a4a6SAndroid Build Coastguard Worker    <serialization.version>1.6.3</serialization.version>
271*57b5a4a6SAndroid Build Coastguard Worker</properties>
272*57b5a4a6SAndroid Build Coastguard Worker```
273*57b5a4a6SAndroid Build Coastguard Worker
274*57b5a4a6SAndroid Build Coastguard WorkerAdd serialization plugin to Kotlin compiler plugin:
275*57b5a4a6SAndroid Build Coastguard Worker
276*57b5a4a6SAndroid Build Coastguard Worker```xml
277*57b5a4a6SAndroid Build Coastguard Worker<build>
278*57b5a4a6SAndroid Build Coastguard Worker    <plugins>
279*57b5a4a6SAndroid Build Coastguard Worker        <plugin>
280*57b5a4a6SAndroid Build Coastguard Worker            <groupId>org.jetbrains.kotlin</groupId>
281*57b5a4a6SAndroid Build Coastguard Worker            <artifactId>kotlin-maven-plugin</artifactId>
282*57b5a4a6SAndroid Build Coastguard Worker            <version>${kotlin.version}</version>
283*57b5a4a6SAndroid Build Coastguard Worker            <executions>
284*57b5a4a6SAndroid Build Coastguard Worker                <execution>
285*57b5a4a6SAndroid Build Coastguard Worker                    <id>compile</id>
286*57b5a4a6SAndroid Build Coastguard Worker                    <phase>compile</phase>
287*57b5a4a6SAndroid Build Coastguard Worker                    <goals>
288*57b5a4a6SAndroid Build Coastguard Worker                        <goal>compile</goal>
289*57b5a4a6SAndroid Build Coastguard Worker                    </goals>
290*57b5a4a6SAndroid Build Coastguard Worker                </execution>
291*57b5a4a6SAndroid Build Coastguard Worker            </executions>
292*57b5a4a6SAndroid Build Coastguard Worker            <configuration>
293*57b5a4a6SAndroid Build Coastguard Worker                <compilerPlugins>
294*57b5a4a6SAndroid Build Coastguard Worker                    <plugin>kotlinx-serialization</plugin>
295*57b5a4a6SAndroid Build Coastguard Worker                </compilerPlugins>
296*57b5a4a6SAndroid Build Coastguard Worker            </configuration>
297*57b5a4a6SAndroid Build Coastguard Worker            <dependencies>
298*57b5a4a6SAndroid Build Coastguard Worker                <dependency>
299*57b5a4a6SAndroid Build Coastguard Worker                    <groupId>org.jetbrains.kotlin</groupId>
300*57b5a4a6SAndroid Build Coastguard Worker                    <artifactId>kotlin-maven-serialization</artifactId>
301*57b5a4a6SAndroid Build Coastguard Worker                    <version>${kotlin.version}</version>
302*57b5a4a6SAndroid Build Coastguard Worker                </dependency>
303*57b5a4a6SAndroid Build Coastguard Worker            </dependencies>
304*57b5a4a6SAndroid Build Coastguard Worker        </plugin>
305*57b5a4a6SAndroid Build Coastguard Worker    </plugins>
306*57b5a4a6SAndroid Build Coastguard Worker</build>
307*57b5a4a6SAndroid Build Coastguard Worker```
308*57b5a4a6SAndroid Build Coastguard Worker
309*57b5a4a6SAndroid Build Coastguard WorkerAdd dependency on serialization runtime library:
310*57b5a4a6SAndroid Build Coastguard Worker
311*57b5a4a6SAndroid Build Coastguard Worker```xml
312*57b5a4a6SAndroid Build Coastguard Worker<dependency>
313*57b5a4a6SAndroid Build Coastguard Worker    <groupId>org.jetbrains.kotlinx</groupId>
314*57b5a4a6SAndroid Build Coastguard Worker    <artifactId>kotlinx-serialization-json</artifactId>
315*57b5a4a6SAndroid Build Coastguard Worker    <version>${serialization.version}</version>
316*57b5a4a6SAndroid Build Coastguard Worker</dependency>
317*57b5a4a6SAndroid Build Coastguard Worker```
318*57b5a4a6SAndroid Build Coastguard Worker
319*57b5a4a6SAndroid Build Coastguard Worker### Bazel
320*57b5a4a6SAndroid Build Coastguard Worker
321*57b5a4a6SAndroid Build Coastguard WorkerTo setup the Kotlin compiler plugin for Bazel, follow [the
322*57b5a4a6SAndroid Build Coastguard Workerexample](https://github.com/bazelbuild/rules_kotlin/tree/master/examples/plugin/src/serialization)
323*57b5a4a6SAndroid Build Coastguard Workerfrom the `rules_kotlin` repository.
324