
Après avoir travaillé sur une bibliothèque multi-plateforme qui collectait des artefacts .framework et .aar, je suis arrivé à la conclusion qu'il y avait déjà beaucoup de choses utiles dans Kotlin, mais beaucoup d'entre nous ne les connaissaient jamais.
Une des choses que vous devez absolument prendre en compte lors de la création d'un projet multi-plateforme est les bibliothèques que vous utilisez lors du développement. Il est préférable de s'en tenir aux solutions fournies par Kotlin hors de la boîte.
Ainsi, lorsque je me suis retrouvé dans une situation où il était nécessaire de sérialiser un document JSON qui devait être utilisé sur deux plates-formes (iOS et Android), il y avait des problèmes lors de la compilation du projet pour iOS. Après un peu de recherche, j'ai trouvé la
bibliothèque Kotlinx Serializtion .
Pour être honnête, je n'ai jamais connu cette bibliothèque, donc cette publication s'adresse plus à des gens qui, comme moi, ne connaissaient pas cet outil.
Le processus de configuration d'un projet pour utiliser le plugin est assez bien décrit dans
le référentiel Github . Mais je vais configurer le projet pour une utilisation Android et multi-plateforme.
La seule chose que vous devez faire avec la compilation multi-plateforme est d'ajouter des dépendances à la fin des dépendances dans votre fichier Grandle natif.
implementation org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1
Exemple Grundle pour une utilisation multiplateforme
plugins { id 'kotlin-multiplatform' version '1.3.11' id 'kotlinx-serialization' version '1.3.10' } repositories { google() jcenter() mavenCentral() maven { url "https://kotlin.bintray.com/kotlinx" } } apply plugin: 'com.android.library' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' androidTestImplementation 'com.android.support.test:runner:1.0.2' } kotlin { targets { fromPreset(presets.android, 'android')
Pour Android
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlinx-serialization' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.smile.kotlinxretrosample" minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:design:28.0.0' implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.okhttp3:okhttp:3.12.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
Sérialisation
Pour sérialiser une classe, ajoutez simplement l'annotation
@Serializable
devant celle-ci
import kotlinx.serialization.Serializable @Serializable class Field { var length: Int = 0 var hint: String = "" var required: Boolean = false }
La sérialisation fonctionne également avec les classes de données.Maintenant, essayons d'écrire un petit exemple pour convertir JSON en un objet et vice versa.
fun toObject(stringValue: String): Field { return JSON.parse(Field.serializer(), stringValue) } fun toJson(field: Field): String {
@Transient
et @Optional
Deux autres annotations méritent d'être mentionnées:
@Transient
- @Transient
Serializer que le champ doit être ignoré.@Optional
- Serializer ne s'arrêtera pas et ne @Optional
pas d'erreur si le champ est absent, mais en même temps, la valeur par défaut doit toujours être définie.
@Optional var isOptional: Boolean = false @Transient var isTransient: Boolean = false
Exemple Android utilisant Retrofit
Pour ceux qui souhaitent utiliser ce plugin en développement pour Android, Retrofit 2 dispose d'un adaptateur.
Lien vers l'adaptateur .
Un peu de code:
un createRetrofit(): Retrofit { val contentType = MediaType.get("application/json") return Retrofit.Builder() .addConverterFactory(serializationConverterFactory(contentType, JSON)) .baseUrl(BASE_URL) .client(provideOkhttpClient()) .build() }
Si votre classe a déjà des annotations, alors après l'envoi de la demande, votre classe doit se transformer en objet JSON.
En général, la sérialisation dans Kotlin est un excellent ajout à tout projet et rend le processus d'enregistrement des données dans une chaîne ou un objet JSON beaucoup plus simple et moins laborieux.
Liste des référentiels
- KotlinxRetrofit est un petit exemple pratique d'utilisation de la sérialisation sur Android
- kotlinx.serialization - Le référentiel principal de la bibliothèque
JakeWharton / retrofit2-kotlinx-serialization-converter - adaptateur pour Retrofit