Serialización de Kotlin con Kotlinx.



Después de trabajar en una biblioteca multiplataforma que recopiló .framework y .aar artefactos, llegué a la conclusión de que ya hay muchas cosas útiles en Kotlin, pero muchos de nosotros nunca supimos de ellas.

Una de las cosas que definitivamente debe tener en cuenta al crear un proyecto multiplataforma son las bibliotecas que utiliza al desarrollar. Es mejor atenerse a las soluciones proporcionadas por Kotlin fuera de la caja.
Entonces, cuando me encontré con una situación en la que era necesario serializar un documento JSON que debía usarse en dos plataformas (iOS y Android), hubo problemas al compilar el proyecto para iOS. Después de un poco de búsqueda, encontré la biblioteca de serialización de Kotlinx .
Para ser sincero, nunca supe de esta biblioteca, por lo que esta publicación es más para personas que, al igual que yo, no conocían esta herramienta.

El proceso de configuración de un proyecto para usar el complemento se describe bastante bien en el repositorio de Github . Pero configuraré el proyecto tanto para Android como para uso multiplataforma.

Lo único que debe hacer con la compilación multiplataforma es agregar dependencias al final de las dependencias en su archivo grandle nativo.

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

Ejemplo de Grundle para uso multiplataforma


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

Serialización


Para serializar una clase, simplemente agregue la anotación @Serializable antes de que

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

La serialización también funciona con clases de datos.

Ahora, intentemos escribir un pequeño ejemplo para convertir JSON en un objeto y viceversa.

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


Otras dos anotaciones que vale la pena mencionar son:

  • @Transient : @Transient serializador de que el campo debe ignorarse.
  • @Optional : el serializador no se detendrá y no arrojará un error si el campo está ausente, pero al mismo tiempo, el valor predeterminado aún debe establecerse.

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

Ejemplo de Android usando Retrofit


Para aquellos que quieran usar este complemento en desarrollo para Android, Retrofit 2 tiene un adaptador. Enlace al adaptador .

Un poco 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() } 

Si su clase ya tiene anotaciones, luego de enviar la solicitud, su clase debería convertirse en un objeto JSON.

En general, la serialización en Kotlin es una excelente adición a cualquier proyecto y hace que el proceso de guardar datos en una cadena u objeto JSON sea mucho más simple y menos laborioso.

Lista de repositorios


  1. KotlinxRetrofit es un pequeño ejemplo de trabajo del uso de la serialización en Android
  2. kotlinx.serialization - El repositorio principal de la biblioteca

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

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


All Articles