
在研究了一个收集.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')
对于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转换为对象,反之亦然。
fun toObject(stringValue: String): Field { return JSON.parse(Field.serializer(), stringValue) } fun toJson(field: Field): String {
@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对象中的过程变得更加简单,省力。
仓库清单
- KotlinxRetrofit是在Android上使用序列化的一个小示例
- kotlinx.serialization-主库存储库
JakeWharton / Retrofit2-kotlinx串行化转换器-Retrofit适配器