用Kotlinx序列化Kotlin.Serialization



在研究了一个收集.framework和.aar工件的多平台库之后,我得出的结论是Kotlin中已经有很多有用的东西,但是我们当中很多人都不知道它们。

创建多平台项目时,您一定要注意的一件事就是开发时使用的库。 最好坚持使用Kotlin提供的解决方案。
因此,当我遇到需要序列化需要在两个平台(iOS和Android)上使用的JSON文档的情况时,在为iOS编译项目时会遇到问题。 经过一番搜索,我找到了Kotlinx Serializtion库
老实说,我从来不知道这个库,所以该出版物更适合像我一样不了解该工具的人。

Github存储库中很好地描述了设置项目以使用插件的过程。 但是我将为Android和多平台配置项目。

多平台编译所需要做的唯一一件事就是将依赖项添加到本机grandle文件中依赖项的末尾。

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

多平台使用的Grundle示例


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

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

序列化


要序列化一个类,只需在其前面添加@Serializable批注

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

序列化也适用于数据类。

现在,让我们尝试编写一个小示例,将JSON转换为对象,反之亦然。

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


值得一提的其他两个注释是:

  • @Transient序列化程序@Transient应该忽略该字段。
  • @Optional如果字段不存在,序列化器将不会停止并且不会引发错误,但是与此同时,仍应设置默认值。

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

使用Retrofit的Android示例


对于那些想在Android开发中使用此插件的人,Retrofit 2提供了一个适配器。 链接到适配器

一点代码:

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

如果您的类已经具有注释,则在发送请求之后,您的类应变成JSON对象。

通常,在Kotlin中进行序列化是对任何项目的出色补充,并且使将数据保存在字符串或JSON对象中的过程变得更加简单,省力。

仓库清单


  1. KotlinxRetrofit是在Android上使用序列化的一个小示例
  2. kotlinx.serialization-主库存储库

JakeWharton / Retrofit2-kotlinx串行化转换器-Retrofit适配器

Source: https://habr.com/ru/post/zh-CN437726/


All Articles