تسلسل الكائنات في Kotlin: نظرة عامة على المكتبات ودليل عملي
\n\nالتسلسل هو عملية تحويل الكائنات المعقدة (الفئات، هياكل البيانات) إلى صيغة مناسبة للتخزين أو النقل عبر الشبكة (JSON، XML، Protobuf). العملية العكسية - إلغاء التسلسل - تستعيد الكائن من هذه الصيغة. في Kotlin، بفضل إيجازها وأمان أنواعها، يتم تنفيذ التسلسل بشكل أنيق بشكل خاص. في هذه المقالة، سننظر في ثلاثة أساليب رئيسية: المكتبة القياسية kotlinx.serialization، بالإضافة إلى حلول Java الشائعة Gson و Jackson المُكيَّفة لـ Kotlin.
1. kotlinx.serialization - الحل الرسمي من JetBrains
\n\nمكتبة kotlinx.serialization هي جزء من نظام Kotlin البيئي ويتم دعمها من قبل مطوري اللغة. تقدم نهجًا أصليًا بدون انعكاس، مما يضمن أداءً عاليًا وأمانًا للأنواع في مرحلة الترجمة.
الإضافة (Gradle)
\nplugins {\n kotlin("jvm") version "1.9.0"\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\n\nمثال: فئة أساسية وتسلسل
\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val age: Int,\n val email: String? = null\n)\n\nfun main() {\n val user = User("أليكسي", 30, "alex@example.com")\n val jsonString = Json.encodeToString(user)\n println(jsonString)\n // {"name":"أليكسي","age":30,"email":"alex@example.com"}\n\n val decoded = Json.decodeFromString<User>(jsonString)\n println(decoded) // User(name=أليكسي, age=30, email=alex@example.com)\n}\n\nالمزايا
\n- \n
- أمان الأنواع: يتم اكتشاف أخطاء التسلسل في مرحلة الترجمة. \n
- دعم متعدد المنصات: يعمل على JVM، JS، Native (KMP). \n
- قابلية التوسع: مسلسلات مخصصة للأنواع المعقدة. \n
- دعم مدمج لـ null، enum، sealed class، المجموعات. \n
مثال متقدم: الكائنات المتداخلة والقوائم
\n@Serializable\ndata class Address(val city: String, val street: String)\n\n@Serializable\ndata class Person(val name: String, val addresses: List<Address>)\n\nfun main() {\n val person = Person("ماريا", listOf(\n Address("موسكو", "تفيرسكايا"),\n Address("سانت بطرسبرغ", "نيفسكي")\n ))\n val json = Json { prettyPrint = true }\n println(json.encodeToString(person))\n // {\n // "name": "ماريا",\n // "addresses": [\n // { "city": "موسكو", "street": "تفيرسكايا" },\n // { "city": "سانت بطرسبرغ", "street": "نيفسكي" }\n // ]\n // }\n}\n\n2. Gson - خفيف الوزن وبسيط
\n\nمكتبة Gson من Google معروفة على نطاق واسع في عالم Java. بالنسبة لـ Kotlin، يتم استخدامها مع إعدادات إضافية لمعالجة data class والحقول القابلة للقيمة null بشكل صحيح.
الإضافة
\nimplementation("com.google.code.gson:gson:2.10.1")\n\nمثال مع Gson
\nimport com.google.gson.Gson\nimport com.google.gson.reflect.TypeToken\n\ndata class Product(val id: Int, val title: String, val price: Double?)\n\nfun main() {\n val gson = Gson()\n val product = Product(1, "لابتوب", 75000.0)\n val json = gson.toJson(product)\n println(json) // {"id":1,"title":"لابتوب","price":75000.0}\n\n val back = gson.fromJson(json, Product::class.java)\n println(back) // Product(id=1, title=لابتوب, price=75000.0)\n}\n\nالخصائص
\n- \n
- لا يتطلب تعليقات توضيحية - يعمل مع أي فئات. \n
- يتطلب تحديد النوع صراحةً عند إلغاء التسلسل (قد يكون غير مريح مع الأدوية). \n
- افتراضيًا، لا يعالج