تسلسل Kotlin مع Kotlinx.Serialization



بعد العمل في مكتبة متعددة المنصات التي جمعت .framework والتحف .aar ، توصلت إلى استنتاج مفاده أن هناك الكثير من الأشياء المفيدة بالفعل في Kotlin ، لكن الكثير منا لم يعرف عنها أبدًا.

تعتبر المكتبات التي تستخدمها عند التطوير أحد الأشياء التي يجب الاهتمام بها عند إنشاء مشروع متعدد المنصات. من الأفضل التمسك بالحلول التي توفرها Kotlin.
لذلك ، عندما حصلت على موقف عندما كانت هناك حاجة إلى إجراء تسلسل لمستند JSON يلزم استخدامه على نظامين أساسيين (iOS و Android) ، كانت هناك مشاكل في تجميع المشروع لنظام iOS. بعد قليل من البحث ، وجدت مكتبة Kotlinx Serializtion .
لكي أكون أمينًا ، لم أكن أعرف مطلقًا عن هذه المكتبة ، لذا فإن هذا المنشور هو أكثر للأشخاص الذين لم يعرفوا بهذه الأداة ، مثلي تمامًا.

تم وصف عملية إعداد مشروع لاستخدام البرنامج المساعد جيدًا في مستودع جيثب . لكنني سوف أقوم بتكوين المشروع لكل من 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 { } } } 

للأندرويد


 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 ، قم ببساطة بإضافة التعليق التوضيحي @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 Serializer أنه يجب تجاهل الحقل.
  • @Optional - Serializer لن تتوقف ولن @Optional حدوث خطأ إذا كان الحقل غائبًا ، ولكن في الوقت نفسه ، لا يزال يجب تعيين القيمة الافتراضية.

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

مثال أندرويد باستخدام التحديثية


بالنسبة لأولئك الذين يرغبون في استخدام هذا المكون الإضافي في التطوير لنظام 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-serialization-converter - adapter for Retrofit

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


All Articles