سریالی‌سازی داده‌ها در توسعه موبایل — این چیست، فرمت‌ها و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-03-08 زمان مطالعه: 8 دقیقه

سریالی‌سازی فرآیند تبدیل یک شیئ یا ساختار داده به یک فرمت تسلسلی است که برای انتقال از طریق شبکه یا ذخیره در فایل مناسب است. فرآیند معکوس، دسریالی‌سازی، داده‌ها را به حالت اولیه بازمی‌گرداند. به استناد به MDN Web Docs، سریالی‌سازی برای هر گونه ارتباط بین‌فرآیندی ضروری است. سریالی‌سازی در پایه REST API، ذخیره‌سازی و تبادل داده بین اجزای برنامه قرار دارد.

نکات کلیدی

  • سریالی‌سازی — تبدیل شیئ به جریان داده برای انتقال یا ذخیره
  • JSON — فرمت متنی اصلی برای REST API و ارتباطات وب
  • Protobuf — فرمت دودایی با بیشترین کارایی و چگالگی
  • XML — فرمت سختگیر با اعتبارسنجی برای Enterprise و توسعه Android
  • انتخاب فرمت به نیازهای کارایی و سازگاری بستگی دارد

سریالی‌سازی چیست؟

سریالی‌سازی فرآیند تبدیل شیئی که در حافظه قرار دارد به یک تسلسل خطی از بایت‌ها یا نشان‌ها است که قابل انتقال از طریق شبکه، ذخیره در فایل یا ارسال به فرآیندی دیگر است. بدون سریالی‌سازی، ارتباطات شبکه‌ای، ذخیره وضعیت و ارتباط بین‌فرآیندی ممکن نیست.

سریالی‌سازی شامل دو فرآیند متضاد است. فرآیند مستقیم (سریالی‌سازی) داده‌ها را برای انتقال بسته‌بندی می‌کند. فرآیند معکوس (دسریالی‌سازی) داده‌ها را به شیئ بازمی‌گرداند. دسریالی‌سازی برای امنیت حریج است: داده‌های ورودی نامناسب می‌توانند منجر به آسیب‌پذیری در برنامه شوند.

در توسعه برنامه‌های موبایل، سریالی‌سازی در هر جا استفاده می‌شود: ارسال درخواست‌ها به سرور و پردازش پاسخ‌ها، ذخیره وضعیت برنامه در چرخش صفحه، ذخیره‌سازی داده‌ها روی دیسک و انتقال داده بین صفحات از طریق 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 (Kotlin Multiplatform)

کتابخانه Kotlinx Serialization از حواشی @Serializable برای کلاس‌ها و پلاگین کامپایلر برای تولید سریالی‌سازها استفاده می‌کند. این کارایی بالا و امنیت نوع را تأمین می‌کند. فرمت پیش‌فرض JSON است، اما فرمت‌های دیگر نیز از طریق ماژول‌های اضافی پشتیبانی می‌شوند.

kotlin
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 در iOS (Swift)

پروتکل Codable مکانیسم سریالی‌سازی ساخته‌شده در Swift است. آن پروتکل‌های Encodable (سریالی‌سازی) و Decodable (دسریالی‌سازی) را ترکیب می‌کند. JSONEncoder و JSONDecoder به طور خودکار ساختارهای تودرتو، آرایه‌ها، مقادیر اختیاری و کلیدهای سفارشی را از طریق CodingKeys پردازش می‌کنند.

swift
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 بایت برای این داده‌ها. ناخوانا — برای مشاهده نیاز به دسریالی‌سازی دارد. اندازه حداقل آن را برای سیستم‌های با بار بالا و برنامه‌های موبایل ایدئال می‌کند.

json
{
  "id": 42,
  "name": "IT Sectr",
  "email": "team@itsectr.com",
  "role": "admin",
  "active": true
}
xml
<user>
    <id>42</id>
    <name>IT Sectr</name>
    <email>team@itsectr.com</email>
    <role>admin</role>
    <active>true</active>
</user>

روش‌های بهتر سریالی‌سازی

روش‌های بهتر به جلوگیری از اشتباهات رایج و انتخاب راهبرد مناسب سریالی‌سازی برای پروژه کمک می‌کند. پیروی از این توصیه‌ها کارایی، امنیت و قابلیت حفظ کد را بهبود می‌بخشد.

توصیه‌ها برای توسعه موبایل

  1. فرمت را بر اساس سناریو انتخاب کنید — JSON برای REST API، Protobuf برای gRPC و میکروسرویس‌ها
  2. از Java Serializable خودداری کنید — مکانیسم کند و ناامن، از Kotlinx Serialization یا Moshi استفاده کنید
  3. کلیدهای ناشناخته را نادیده بگیرید — پارسر را برای ذخت کردن فیلدهای غیرموجود در مدل پیکربندی کنید
  4. داده‌های دسریالی‌شده را ذخیره کنید — از تجزیه و تحلیل مکرر داده‌های یکسان خودداری کنید
  5. داده‌های ورودی را اعتبارسنجی کنید — در زمان دسریالی‌سازی مرزها و انواع را بررسی کنید

امنیت و سریالی‌سازی

امنیت سریالی‌سازی جنبه‌ای بسیار مهم است، به ویژه در دسریالی‌سازی داده‌هایی از منابع مشکوک. حملات دسریالی‌سازی می‌توانند منجر به اجرای کد از راه دور (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 کندترین فرمات از فرمت‌های معروف است.

برای Android چه انتخاب کنیم: Gson، Moshi یا Kotlinx Serialization؟

Kotlinx Serialization بهترین انتخاب برای پروژه‌های جدید در Kotlin است: تولید در کامپایلر، پشتیبانی از Kotlin Multiplatform، null safety. Moshi انتخاب مناسبی برای پروژه‌های Java است و از Gson کاراتر است. Gson ساده‌ترین کتابخانه برای شروع است، اما کندتر است و از بازتاب استفاده می‌کند.

چگونه یک شیئ را با ارجاعات چرخشی سریالی‌سازی کنیم؟

ارجاعات چرخشی منجر به بازگشت بی‌نهایت در سریالی‌سازی می‌شود. راه‌حل‌ها: به جای ارجاعات مستقیم به شیئ‌ها از ارجاعات ID استفاده کنید، از آداپترهای سریالی‌سازی ویژه استفاده کنید (مثلاً @JsonIgnore در Jackson)، یا مدل داده را برای الغاء چرخش‌ها مجدداً طراحی کنید.

آیا سریالی‌سازی بر امنیت برنامه تأثیر می‌گذارد؟

بله، به ویژه دسریالی‌سازی داده‌های مشکوک. آسیب‌پذیری دسریالی‌سازی می‌تواند منجر به اجرای کد از راه دور شود. توصیه‌ها: داده‌ها را از منابع مشکوک دسریالی‌سازی نکنید، از allowlist کلاس در زمان دسریالی‌سازی استفاده کنید و شمات داده را قبل از پردازش اعتبارسنجی کنید.

نتیجه‌گیری

  • سریالی‌سازی شیئ‌ها را به جریان داده برای انتقال و ذخیره تبدیل می‌کند، دسریالی‌سازی آنها را بازمی‌گرداند
  • JSON — استاندارد REST API، XML — برای گردش اسناد، Protobuf — برای میکروسرویس‌ها و بار بالا
  • فرمت‌های دودایی (Protobuf، FlatBuffers) ۳-۱۰ برابر چگال‌تر و سریع‌تر از متنی هستند
  • در Android Kotlinx Serialization، در iOS — Codable ساخته‌شده توصیه می‌شود
  • ذخیره‌سازی داده‌های دسریالی‌شده بار پروازنده را کاهش می‌دهد و برنامه را سریع‌تر می‌کند
  • امنیت دسریالی‌سازی حریج است — داده‌های ورودی را بررسی کنید و از allowlist استفاده کنید
  • انتخاب فرمات یک معامله بین خوانایی، کارایی و سازگاری است

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید