التسلسل هو عملية تحويل كائن أو هيكل بيانات إلى تسلسل منظم مناسب لنقله عبر الشبكة أو حفظه في ملف. العملية العكسية، إلغاء التسلسل، تعيد البيانات إلى حالتها الأصلية. وفقًا لـ MDN Web Docs، يعد التسلسل ضروريًا لأي تواصل بين العمليات. يكمن التسلسل في أساس واجهات API REST، والتخزين المؤقت، وتبادل البيانات بين مكونات التطبيق.
النقاط الرئيسية
التسلسل هو عملية تحويل كائن موجود في الذاكرة العشوائية إلى تسلسل خطي من البايتات أو الرموز يمكن نقله عبر الشبكة، أو حفظه في ملف، أو إرساله إلى عملية أخرى. بدون التسلسل، لا يمكن الاتصال الشبكي، ولا الاحتفاظ بالحالة، ولا التفاعل بين العمليات.
يتضمن التسلسل عمليتين متضادتين. العملية المباشرة (التسلسل) تغلف البيانات في تنسيق للإرسال. العملية العكسية (إلغاء التسلسل) تستعيد البيانات إلى الكائن. إلغاء التسلسل حاسم للأمان: بيانات الإدخال غير الصحيحة قد تؤدي إلى ثغرات في التطبيق.
في تطوير التطبيقات المحمولة، يستخدم التسلسل في كل مكان: إرسال الطلبات إلى الخادم ومعالجة الردود، حفظ حالة التطبيق عند تدوير الشاشة، تخزين البيانات مؤقتًا على القرص، ونقل البيانات بين الشاشات عبر Intent (Android) أو Segue (iOS).
تنقسم أنماط التسلسل إلى نصية وثنائية. الأنماط النصية (JSON، XML) قابلة للقراءة بواسطة البشر ولا تتطلب أدوات للعرض. الأنماط الثنائية (Protobuf، FlatBuffers، MessagePack) أكثر انضغاطًا وسرعة ولكن غير قابلة للقراءة دون إلغاء التسلسل. اختيار التنسيق هو مفاضلة بين الأداء وراحة التصحيح.
بالإضافة إلى JSON، XML و Protobuf، هناك أنماط متخصصة: FlatBuffers من Google للألعاب والواقع المعزز، MessagePack — بديل ثنائي مضغوط لـ JSON، Avro من Apache للبيانات الضخمة في Kafka، YAML — تنسيق تهيئة بدعم التعليقات.
| التنسيق | النوع | المخطط | الحجم | السرعة |
|---|---|---|---|---|
| JSON | نصي | اختياري | متوسط | متوسطة |
| XML | نصي | XSD | كبير | منخفضة |
| Protobuf | ثنائي | إلزامي | صغير | عالية |
| FlatBuffers | ثنائي | إلزامي | صغير | قصوى |
| MessagePack | ثنائي | لا | صغير | عالية |
| Avro | ثنائي | JSON Schema | صغير | عالية |
لـ التسلسل على المنصات المحمولة خصائصه الخاصة: حركة مرور محدودة، معالجات أقل قوة، والحاجة للحفاظ على الحالة عند تدوير الشاشة. في Android تستخدم Gson، Moshi، Kotlinx Serialization. في iOS — Codable، JSONSerialization، PropertyListEncoder. يؤثر اختيار المكتبة الصحيح بشكل حاسم على أداء التطبيق.
Kotlinx Serialization هي مكتبة حديثة من JetBrains لـ Kotlin Multiplatform Mobile. تدعم JSON، Protobuf، CBOR والأنماط المخصصة. يتم إنشاء الكود في وقت الترجمة من خلال الإضافة Kotlin Serialization، مما يضمن أداءً عاليًا دون استخدام الانعكاس.
تستخدم مكتبة Kotlinx Serialization الوسم @Serializable للفئات وإضافة المترجم لإنشاء المسلسلات. يضمن ذلك أداءً عاليًا وأمانًا في الأنواع. التنسيق الافتراضي هو JSON، ولكن تدعم الأنماط الأخرى من خلال وحدات إضافية.
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
@Serializable
data class Project(
val id: Int,
val name: String,
val platforms: List<String>,
val active: Boolean
)
val json = Json {
prettyPrint = true
ignoreUnknownKeys = true
encodeDefaults = true
}
fun main() {
val project = Project(1, "MobileApp",
listOf("Android", "iOS"), true)
// إجراء التسلسل
val jsonString = json.encodeToString(project)
// إلغاء التسلسل
val restored = json.decodeFromString<Project>(jsonString)
}
بروتوكول Codable هو آلية التسلسل المضمنة في Swift. يجمع بين بروتوكولي Encodable (التسلسل) و Decodable (إلغاء التسلسل). يقوم JSONEncoder و JSONDecoder بمعالجة الهياكل المتداخلة، والمصفوفات، والقيم الاختيارية، والمفاتيح المخصصة عبر CodingKeys تلقائيًا.
import Foundation
struct AppConfig: Codable {
let appName: String
let version: String
let features: [String]
let isProduction: Bool
}
let config = AppConfig(
appName: "MyApp",
version: "2.1.0",
features: ["push", "analytics", "offline"],
isProduction: true
)
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
guard let data = try? encoder.encode(config) else { return }
let jsonString = String(data: data, encoding: .utf8)
يتم تقييم أداء أنماط التسلسل بواسطة ثلاث مقاييس: حجم الرسالة، سرعة التسلسل وسرعة إلغاء التسلسل. بالنسبة للتطبيقات المحمولة، الثلاثة أمر حاسم: الحجم يؤثر على حركة المرور ووقت التحميل، والسرعة تؤثر على استجابة الواجهة ووقت تشغيل التطبيق.
يظهر Protobuf و FlatBuffers أفضل النتائج بفضل التمثيل الثنائي. يتميز FlatBuffers بأنه لا يتطلب خطوة منفصلة لإلغاء التسلسل — تقرأ البيانات مباشرة من البافر الثنائي، مما يجعله مثاليًا للألعاب وتطبيقات الواقع المعزز بمتطلبات زمن استجابة أدنى. يظل JSON التنسيق الأكثر شيوعًا لواجهات API REST، على الرغم من أدائه الأسوأ، بسبب بساطته وعموميته.
| السيناريو | التنسيق الموصى به | السبب |
|---|---|---|
| API REST | JSON | عمومية، قابلية للقراءة، دعم |
| خدمات مصغرة | Protobuf | انضغاط، سرعة، gRPC |
| ألعاب / واقع معزز | FlatBuffers | Zero-copy، زمن استجابة أدنى |
| بيانات ضخمة | Avro | التوافق مع Kafka و Hadoop |
| التهيئة | YAML | تعليقات، قابلية للقراءة |
| تخطيطات Android | XML | معيار المنصة |
تظهر الاختبارات العملية على مجموعة بيانات من 1000 كائن مستخدم: Protobuf ينشئ رسائل بحجم 12 كيلوبايت (JSON — 85 كيلوبايت، XML — 120 كيلوبايت). وقت التسلسل: Protobuf — 2 مللي ثانية، JSON — 8 مللي ثانية، XML — 25 مللي ثانية. تجعل هذه الأرقام الأنماط الثنائية مفضلة للأنظمة عالية الحمل والتطبيقات المحمولة ذات حركة مرور محدودة.
تظهر الأمثلة تسلسل نفس الكائن بأنماط مختلفة. يساعد ذلك في مقارنة الحجم والقابلية للقراءة بصريًا. سيتم تسلسل نفس كائن User بتنسيق JSON، XML و Protobuf — من الواضح أن JSON أكثر انضغاطًا من XML، و Protobuf هو الأكثر انضغاطًا من الجميع ولكنه غير قابل للقراءة.
JSON — نحو بسيط، مفاتيح بين قوسين، قيم من أنواع مختلفة. يشغل 80 حرفًا. القابلية للقراءة عالية، الهيكل المرئي واضح. مناسب لواجهات API حيث تهم سرعة التطوير والتصحيح.
XML — كل عنصر ملفوف بوسمي فتح وإغلاق. يشغل 150 حرفًا. القابلية للقراءة متوسطة، الهيكل صارم. مناسب لتدفق المستندات والأنظمة التي تتطلب التحقق من XSD.
Protobuf — ثنائي، 32 بايت لهذه البيانات. غير قابل للقراءة — يتطلب إلغاء التسلسل للعرض. الحجم الصغير يجعله مثاليًا للأنظمة عالية الحمل والتطبيقات المحمولة.
{
"id": 42,
"name": "IT Sectr",
"email": "team@itsectr.com",
"role": "admin",
"active": true
}
<user>
<id>42</id>
<name>IT Sectr</name>
<email>team@itsectr.com</email>
<role>admin</role>
<active>true</active>
</user>
تساعد أفضل الممارسات في تجنب الأخطاء الشائعة واختيار استراتيجية التسلسل الصحيحة للمشروع. يؤدي اتباع هذه التوصيات إلى تحسين الأداء والأمان وقابلية صيانة الكود.
أمان التسلسل هو جانب حاسم الأهمية، وخاصة عند إلغاء تسلسل البيانات من مصادر غير موثوقة. يمكن أن تؤدي هجومات إلغاء التسلسل إلى تنفيذ الكود عن بعد (RCE)، وهي واحدة من أخطر الثغرات في تطبيقات الويب والتطبيقات المحمولة. ترتبط أكثر الحالات المعروفة بـ Java Serializable و Python pickle.
يوجد في Protobuf و JSON حماية مضمنة ضد هذه الهجومات، لأنهما يعملان فقط مع البيانات وليس مع كائنات عشوائية. على النقيض من ذلك، يمكن Java Serializable استعادة أي فئة متاحة في classpath، مما يجعله خطيرًا لاستقبال البيانات من مصادر خارجية. في Android، يوصى باستخدام Kotlinx Serialization أو Moshi بدلًا من Java Serialization القياسية.
تدابير أمانية إضافية: حدد حدًا لحجم بيانات الإدخال، تحقق من المخطط قبل إلغاء التسلسل، لا تثق في Content-Type من ترويسات HTTP، استخدم قائمة بيضاء للفئات المسموح بها. حدث مكتبات التسلسل بانتظام، فالثغرات تكتشف وتصلح بشكل دوري.
الأسئلة الشائعة
التسلسل يحول الكائن إلى تسلسل بايتات، أما المعالجة التوزيعية (marshalling) فتنقل البيانات بين مساحات عنوان مختلفة مع الحفاظ على الأنواع والهيكل. يتضمن المعالجة التوزيعية التسلسل كجزء من العملية، ولكن قد تشمل أيضًا تشفير المراجع وإدارة الذاكرة.
يوفر FlatBuffers من Google أقصى السرعة بفضل إلغاء التسلسل zero-copy — تقرأ البيانات مباشرة من البافر الثنائي دون تحويل. يأتي Protobuf في المرتبة الثانية، و JSON في الثالثة. XML هو أبطأ تنسيق بين الأنماط الشائعة.
Kotlinx Serialization هو الخيار الأفضل للمشاريع الجديدة بـ Kotlin: إنشاء عند الترجمة، دعم Kotlin Multiplatform، null safety. Moshi هو خيار جيد للمشاريع بـ Java، أكثر كفاءة من Gson. Gson هي أبسط مكتبة للبدء ولكنها أبطأ وتستخدم الانعكاس.
تؤدي المراجع الدائرية إلى عودة لا نهاية لها أثناء التسلسل. الحلول: استخدم مراجع بالمعرف بدلًا من المراجع المباشرة للكائنات، طبق محولات تسلسل متخصصة (مثل @JsonIgnore في Jackson)، أو أعد تصميم نموذج البيانات لإزالة الدورات.
نعم، وخاصة إلغاء تسلسل البيانات غير الموثوقة. يمكن أن تؤدي ثغرات إلغاء التسلسل إلى تنفيذ الكود عن بعد. التوصيات: لا تقم بإلغاء تسلسل البيانات من مصادر غير موثوقة، استخدم قائمة بيضاء للفئات أثناء إلغاء التسلسل، وتحقق من مخطط البيانات قبل المعالجة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.