
Nachdem ich an einer plattformübergreifenden Bibliothek gearbeitet hatte, in der .framework- und .aar-Artefakte gesammelt wurden, kam ich zu dem Schluss, dass es in Kotlin bereits viele nützliche Dinge gibt, aber viele von uns wussten nie davon.
Eines der Dinge, auf die Sie beim Erstellen eines Multi-Plattform-Projekts unbedingt achten sollten, sind die Bibliotheken, die Sie bei der Entwicklung verwenden. Halten Sie sich am besten sofort an die von Kotlin bereitgestellten Lösungen.
Als ich in eine Situation geriet, in der ein JSON-Dokument serialisiert werden musste, das auf zwei Plattformen (iOS und Android) verwendet werden musste, traten Probleme beim Kompilieren des Projekts für iOS auf. Nach einigem Suchen fand ich die
Kotlinx Serializtion-Bibliothek .
Um ehrlich zu sein, wusste ich nie etwas über diese Bibliothek, daher ist diese Veröffentlichung eher für Leute gedacht, die genau wie ich nichts über dieses Tool wussten.
Der Prozess zum Einrichten eines Projekts zur Verwendung des Plugins ist im
Github-Repository recht gut beschrieben. Ich werde das Projekt jedoch sowohl für Android als auch für die Verwendung auf mehreren Plattformen konfigurieren.
Das einzige, was Sie bei der plattformübergreifenden Kompilierung tun müssen, ist das Hinzufügen von Abhängigkeiten am Ende der Abhängigkeiten in Ihrer nativen Grandle-Datei.
implementation org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1
Grundle-Beispiel für die Verwendung auf mehreren Plattformen
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')
Für 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' }
Serialisierung
Um eine Klasse zu serialisieren, fügen
@Serializable
einfach die Annotation
@Serializable
davor hinzu
import kotlinx.serialization.Serializable @Serializable class Field { var length: Int = 0 var hint: String = "" var required: Boolean = false }
Die Serialisierung funktioniert auch mit Datenklassen.Versuchen wir nun, ein kleines Beispiel für die Konvertierung von JSON in ein Objekt zu schreiben und umgekehrt.
fun toObject(stringValue: String): Field { return JSON.parse(Field.serializer(), stringValue) } fun toJson(field: Field): String {
@Transient
und @Optional
Zwei weitere erwähnenswerte Anmerkungen sind:
@Transient
- @Transient
Serializer, dass das Feld ignoriert werden soll.@Optional
- Der Serializer stoppt nicht und gibt keinen Fehler aus, wenn das Feld nicht vorhanden ist. Gleichzeitig sollte der Standardwert weiterhin festgelegt werden.
@Optional var isOptional: Boolean = false @Transient var isTransient: Boolean = false
Android-Beispiel mit Retrofit
Für diejenigen, die dieses Plugin in der Entwicklung für Android verwenden möchten, hat Retrofit 2 einen Adapter.
Link zum Adapter .
Ein bisschen Code:
un createRetrofit(): Retrofit { val contentType = MediaType.get("application/json") return Retrofit.Builder() .addConverterFactory(serializationConverterFactory(contentType, JSON)) .baseUrl(BASE_URL) .client(provideOkhttpClient()) .build() }
Wenn Ihre Klasse bereits Anmerkungen enthält, sollte Ihre Klasse nach dem Senden der Anforderung in ein JSON-Objekt umgewandelt werden.
Im Allgemeinen ist die Serialisierung in Kotlin eine großartige Ergänzung für jedes Projekt und macht das Speichern von Daten in einer Zeichenfolge oder einem JSON-Objekt viel einfacher und weniger arbeitsintensiv.
Repository-Liste
- KotlinxRetrofit ist ein kleines Beispiel für die Verwendung der Serialisierung unter Android
- kotlinx.serialization - Das Hauptbibliotheks-Repository
JakeWharton / retrofit2-kotlinx-serialization-converter - Adapter für Retrofit