
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')
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.
fun toObject(stringValue: String): Field { return JSON.parse(Field.serializer(), stringValue) } fun toJson(field: Field): String {
@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
- KotlinxRetrofit é um pequeno exemplo prático de uso de serialização no Android
- kotlinx.serialization - O repositório da biblioteca principal
JakeWharton / retrofit2-kotlinx-serialization-converter - adaptador para Retrofit