Serializando o Kotlin com o Kotlinx.Serialization



Depois de trabalhar em uma biblioteca multiplataforma que coletou artefatos .framework e .aar, cheguei à conclusão de que já existem muitas coisas úteis no Kotlin, mas muitos de nós nunca os conhecemos.

Uma das coisas que você definitivamente deve cuidar ao criar um projeto de plataforma múltipla são as bibliotecas que você usa ao desenvolver. É melhor seguir as soluções fornecidas pela Kotlin imediatamente.
Portanto, quando entrei em uma situação em que havia a necessidade de serializar um documento JSON que precisava ser usado em duas plataformas (iOS e Android), houve problemas na compilação do projeto para iOS. Após algumas pesquisas, encontrei a biblioteca de serialização da Kotlinx .
Para ser sincero, nunca soube dessa biblioteca, portanto esta publicação é mais para pessoas que, assim como eu, não conheciam essa ferramenta.

O processo de configuração de um projeto para usar o plug-in é bastante bem descrito no repositório do Github . Mas vou configurar o projeto para Android e multiplataforma.

A única coisa que você precisa fazer com a compilação de várias plataformas é adicionar dependências ao final das dependências no seu arquivo grandle nativo.

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

Exemplo Grundle para uso em várias plataformas


 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 { } } } 

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

Serialização


Para serializar uma classe, basta adicionar a anotação @Serializable à sua frente

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

A serialização também funciona com classes de dados.

Agora, vamos tentar escrever um pequeno exemplo para converter JSON para e de um objeto.

 /* * { 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 e @Optional


Duas outras anotações que vale a pena mencionar são:

  • @Transient - @Transient serializador que o campo deve ser ignorado.
  • @Optional - O serializador não para e não gera um erro se o campo estiver ausente, mas, ao mesmo tempo, o valor padrão ainda deve ser definido.

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

Exemplo do Android usando Retrofit


Para quem deseja usar este plugin no desenvolvimento para Android, o Retrofit 2 possui um adaptador. Link para o adaptador .

Um pouco de código:

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

Se sua classe já tiver anotações, depois de enviar a solicitação, ela deverá se transformar em um objeto JSON.

Em geral, a serialização no Kotlin é uma excelente adição a qualquer projeto e torna o processo de salvar dados em uma string ou objeto JSON muito mais simples e menos trabalhoso.

Lista de Repositórios


  1. KotlinxRetrofit é um pequeno exemplo prático de uso de serialização no Android
  2. kotlinx.serialization - O repositório da biblioteca principal

JakeWharton / retrofit2-kotlinx-serialization-converter - adaptador para Retrofit

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


All Articles