سریالیسازی فرآیند تبدیل یک شیئ یا ساختار داده به یک فرمت تسلسلی است که برای انتقال از طریق شبکه یا ذخیره در فایل مناسب است. فرآیند معکوس، دسریالیسازی، دادهها را به حالت اولیه بازمیگرداند. به استناد به MDN Web Docs، سریالیسازی برای هر گونه ارتباط بینفرآیندی ضروری است. سریالیسازی در پایه REST API، ذخیرهسازی و تبادل داده بین اجزای برنامه قرار دارد.
نکات کلیدی
سریالیسازی فرآیند تبدیل شیئی که در حافظه قرار دارد به یک تسلسل خطی از بایتها یا نشانها است که قابل انتقال از طریق شبکه، ذخیره در فایل یا ارسال به فرآیندی دیگر است. بدون سریالیسازی، ارتباطات شبکهای، ذخیره وضعیت و ارتباط بینفرآیندی ممکن نیست.
سریالیسازی شامل دو فرآیند متضاد است. فرآیند مستقیم (سریالیسازی) دادهها را برای انتقال بستهبندی میکند. فرآیند معکوس (دسریالیسازی) دادهها را به شیئ بازمیگرداند. دسریالیسازی برای امنیت حریج است: دادههای ورودی نامناسب میتوانند منجر به آسیبپذیری در برنامه شوند.
در توسعه برنامههای موبایل، سریالیسازی در هر جا استفاده میشود: ارسال درخواستها به سرور و پردازش پاسخها، ذخیره وضعیت برنامه در چرخش صفحه، ذخیرهسازی دادهها روی دیسک و انتقال داده بین صفحات از طریق Intent (Android) یا Segue (iOS).
فرمتهای سریالیسازی به دو دسته متنی و دودایی تقسیم میشوند. فرمتهای متنی (JSON، XML) توسط انسان قابل خواندن هستند و نیازی به ابزار برای مشاهده ندارند. فرمتهای دودایی (Protobuf، FlatBuffers، MessagePack) چگالتر و سریعتر هستند اما بدون دسریالیسازی قابل خواندن نیستند. انتخاب فرمت یک معامله بین کارایی و راحتی اشکالیابی است.
علاوه بر JSON، XML و Protobuf، فرمتهای تخصصی نیز وجود دارند: FlatBuffers از Google برای بازیها و AR، 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 از این نظر متمایز است که به مرحله جداگانه دسریالیسازی نیاز ندارد — دادهها مستقیماً از بافر دودایی خوانده میشوند، که برای بازیها و برنامههای AR با نیاز به تأخیر حداقل ایدئال است. JSON علیرغم کارایی پایینتر، به دلیل سادگی و جهانی بودن، محبوبترین فرمت برای REST API باقی مانده است.
| سناریو | فرمت توصیهشده | دلیل |
|---|---|---|
| REST API | JSON | جهانی بودن، خوانایی، پشتیبانی |
| میکروسرویسها | Protobuf | چگالگی، سرعت، gRPC |
| بازیها / AR | FlatBuffers | Zero-copy، تأخیر حداقل |
| Big Data | Avro | سازگاری با Kafka و Hadoop |
| پیکربندی | YAML | توضیحات، خوانایی |
| Android layouts | 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 توصیه میشود به جای استاندارد Java Serialization از Kotlinx Serialization یا Moshi استفاده کنید.
اقدامات امنیتی اضافی: برای اندازه دادههای ورودی حد قایل شوید، شمات را قبل از دسریالیسازی اعتبارسنجی کنید، به Content-Type از سراصصفحههای HTTP اعتماد نکنید، از allowlist برای کلاسهای مجاز استفاده کنید. کتابخانههای سریالیسازی را منظم بهروز کنید، زیرا آسیبپذیری در آنها به طور دورهای کشف و رفع میشوند.
سؤالات متداول
سریالیسازی شیئ را به تسلسل بایت ها تبدیل میکند، مارشالینگ (marshalling) دادهها را با حفظ انواع و ساختار بین فضاهای آدرسی مختلف انتقال میدهد. مارشالینگ شامل سریالیسازی به عنوان بخشی از فرآیند است، اما میتواند همچنین شامل کدگذاری ارجاعات و مدیریت حافظه باشد.
FlatBuffers از Google به دلیل دسریالیسازی zero-copy حداکثر سرعت را فراهم میکند — دادهها مستقیماً از بافر دودایی بدون تبدیل خوانده میشوند. Protobuf در رتبه دوم، JSON در رتبه سوم قرار دارد. XML کندترین فرمات از فرمتهای معروف است.
Kotlinx Serialization بهترین انتخاب برای پروژههای جدید در Kotlin است: تولید در کامپایلر، پشتیبانی از Kotlin Multiplatform، null safety. Moshi انتخاب مناسبی برای پروژههای Java است و از Gson کاراتر است. Gson سادهترین کتابخانه برای شروع است، اما کندتر است و از بازتاب استفاده میکند.
ارجاعات چرخشی منجر به بازگشت بینهایت در سریالیسازی میشود. راهحلها: به جای ارجاعات مستقیم به شیئها از ارجاعات ID استفاده کنید، از آداپترهای سریالیسازی ویژه استفاده کنید (مثلاً @JsonIgnore در Jackson)، یا مدل داده را برای الغاء چرخشها مجدداً طراحی کنید.
بله، به ویژه دسریالیسازی دادههای مشکوک. آسیبپذیری دسریالیسازی میتواند منجر به اجرای کد از راه دور شود. توصیهها: دادهها را از منابع مشکوک دسریالیسازی نکنید، از allowlist کلاس در زمان دسریالیسازی استفاده کنید و شمات داده را قبل از پردازش اعتبارسنجی کنید.
نتیجهگیری
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید