Serializing Kotlin dengan Kotlinx. Serialisasi



Setelah bekerja di perpustakaan multi-platform yang mengumpulkan artefak .framework dan .ar, saya sampai pada kesimpulan bahwa sudah banyak hal berguna di Kotlin, tetapi banyak dari kita tidak pernah tahu tentang mereka.

Salah satu hal yang harus Anda urus ketika membuat proyek multi-platform adalah perpustakaan yang Anda gunakan saat mengembangkan. Yang terbaik adalah tetap pada solusi yang disediakan oleh Kotlin di luar kotak.
Jadi, ketika saya berada dalam situasi ketika ada kebutuhan untuk membuat serial dokumen JSON yang perlu digunakan pada dua platform (iOS dan Android), ada masalah dalam menyusun proyek untuk iOS. Setelah sedikit mencari, saya menemukan perpustakaan Kotlinx Serializtion .
Sejujurnya, saya tidak pernah tahu tentang perpustakaan ini, jadi publikasi ini lebih untuk orang-orang yang, sama seperti saya, tidak tahu tentang alat ini.

Proses pengaturan proyek untuk menggunakan plugin dijelaskan dengan cukup baik dalam repositori Github . Tapi saya akan mengkonfigurasi proyek untuk penggunaan Android dan multi-platform.

Satu-satunya hal yang perlu Anda lakukan dengan kompilasi multi-platform adalah menambahkan dependensi ke akhir dependensi dalam file grandle asli Anda.

implementation org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1 

Contoh Grundle untuk penggunaan multi-platform


 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') //    iPhone //   presets.iosArm64 ( iosArm32)     iPhone fromPreset(presets.iosX64, 'ios') { compilations.main.outputKinds('FRAMEWORK') } } sourceSets { commonMain { dependencies { implementation 'org.jetbrains.kotlin:kotlin-stdlib-common' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1' } } commonTest { dependencies { implementation 'org.jetbrains.kotlin:kotlin-test-common' implementation 'org.jetbrains.kotlin:kotlin-test-annotations-common' } } androidMain { dependencies { implementation 'org.jetbrains.kotlin:kotlin-stdlib' } } androidTest { dependencies { } } iosMain { dependencies{ implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1" } } iosTest { } } } 

Untuk 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' } 

Serialisasi


Untuk membuat serial suatu kelas, cukup tambahkan penjelasan @Serializable di depannya

 import kotlinx.serialization.Serializable @Serializable class Field { var length: Int = 0 var hint: String = "" var required: Boolean = false } 

Serialisasi juga bekerja dengan kelas data.

Sekarang, mari kita coba menulis contoh kecil untuk mengonversi JSON ke objek dan sebaliknya.

 /* * { length = 20 hint = "example" required= false } */ fun toObject(stringValue: String): Field { return JSON.parse(Field.serializer(), stringValue) } fun toJson(field: Field): String { //  ,    Serializer,       //   ,     @Serializer return JSON.stringify(Field.serializer(), field) } 

@Transient dan @Optional


Dua anotasi lain yang layak disebutkan adalah:

  • @Transient - @Transient Serializer bahwa bidang tersebut harus diabaikan.
  • @Optional - Serializer tidak akan berhenti dan tidak akan melempar kesalahan jika bidang tidak ada, tetapi pada saat yang sama, nilai default tetap harus ditetapkan.

 @Optional var isOptional: Boolean = false @Transient var isTransient: Boolean = false 

Contoh Android menggunakan Retrofit


Bagi mereka yang ingin menggunakan plugin ini dalam pengembangan untuk Android, Retrofit 2 memiliki adaptor. Tautan ke adaptor .

Sedikit kode:

 un createRetrofit(): Retrofit { val contentType = MediaType.get("application/json") return Retrofit.Builder() .addConverterFactory(serializationConverterFactory(contentType, JSON)) .baseUrl(BASE_URL) .client(provideOkhttpClient()) .build() } 

Jika kelas Anda sudah memiliki anotasi, maka setelah mengirim permintaan, kelas Anda akan berubah menjadi objek JSON.

Secara umum, serialisasi di Kotlin adalah tambahan yang bagus untuk proyek apa pun dan membuat proses menyimpan data dalam string atau objek JSON jauh lebih sederhana, kurang padat karya.

Daftar repositori


  1. KotlinxRetrofit adalah contoh kerja kecil menggunakan serialisasi di Android
  2. kotlinx.serialization - Repositori perpustakaan utama

JakeWharton / retrofit2-kotlinx-serialization-converter - adaptor untuk Retrofit

Source: https://habr.com/ru/post/id437726/


All Articles