سریالسازی و دیسریالسازی فرآیندهای اساسی تبدیل اشیاء به فرمت برای انتقال یا ذخیرهسازی هستند. در توسعه موبایل، این مکانیزمها در هر درخواست شبکهای، ذخیره وضعیت و ارتباط بین فرآیندی استفاده میشوند. به گزارش MDN Web Docs, 2024، JSON محبوبترین فرمت سریالسازی در وب و برنامههای موبایل باقی مانده است و از XML و Protocol Buffers پیشی گرفته است.
نکات اصلی
سریالسازی فرآیند تبدیل شیء برنامه به فرمتی مناسب برای ارسال از طریق شبکه یا ذخیرهسازی روی دیسک است. دیسریالسازی تبدیل معکوس را انجام میدهد و شیء را از دادههای دریافتی بازیابی میکند. در توسعه موبایل، سریالسازی در درخواستهای API، ذخیره وضعیت صفحه، کشکردن و انتقال داده از طریق Intent یا Bundle استفاده میشود.
هر تعاملی بین اجزای برنامه یا بین برنامه و سرور نیاز به سریالسازی دارد. REST API دادهها را در JSON یا XML منتقل میکند، gRPC از Protocol Buffers استفاده میکند، و ارتباط درونفرآیندی در Android از Parcelable استفاده میکند. بدون سریالسازی، نمیتوان یک شیء پیچیده را از مرز فرآیند عبور داد یا در پایگاه داده ذخیره کرد.
// اصل کلی سریالسازی
data class User(
val id: Int,
val name: String,
val email: String
)
// سریالسازی: شیء -> JSON
fun serializeUser(user: User): String {
return """{"id":${user.id},"name":"${user.name}","email":"${user.email}"}"""
}
// دیسریالسازی: JSON -> شیء
fun deserializeUser(json: String): User? {
// تجزیه JSON به شیء
return Gson().fromJson(json, User::class.java)
}
| فرمت | حجم | سرعت | قابلیت خواندن | نوعبندی |
|---|---|---|---|---|
| JSON | متوسط | بالا | بالا | پویا |
| XML | بزرگ | متوسط | بالا | طرح XSD |
| Protocol Buffers | کوچک | بسیار بالا | پایین | سختگیرانه .proto |
| FlatBuffers | کوچک | حداکثر | پایین | سختگیرانه .fbs |
JSON (JavaScript Object Notation) یک فرمت متنی سبک بر اساس نحو اشیاء جاوااسکریپت است. JSON از رشتهها، اعداد، مقادیر بولی، آرایهها و اشیاء تو در تو پشتیبانی میکند که اکثر سناریوهای انتقال داده در برنامههای موبایل را پوشش میدهد. این فرمت مستقل از پلتفرم است: هر اکوسیستم ابزارهای داخلی برای تجزیه آن ارائه میدهد.
JSON به دلیل سادگی و جهانی بودن برنده است. توسعهدهنده برای استفاده اولیه نیازی به طرح ندارد — ساختار در زمان تجزیه به صورت پویا تعیین میشود. قابلیت خواندن فرمت اشکالزدایی و آزمایش را ساده میکند: پاسخ سرور را میتوان در هر ابزار توسعهدهنده مشاهده کرد. در هر دو پلتفرم موبایل، JSON بدون نیاز به کتابخانههای شخص ثالث به صورت بومی پردازش میشود.
// Codable — سریالسازی بومی JSON در Swift
struct User: Codable {
let id: Int
let name: String
let email: String
}
let jsonString = """{"id":1,"name":"John","email":"john@test.com"}"""
let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
let user = try! decoder.decode(User.self, from: jsonData)
Protocol Buffers (protobuf) یک فرمت سریالسازی باینری است که توسط گوگل برای سیستمهای با عملکرد بالا توسعه یافته است. برخلاف JSON، protobuf نیاز به تعریف قبلی طرح در فایل .proto دارد، اما حجم داده بسیار کمتر و سرعت پردازش بیشتری را فراهم میکند. این فرمت در gRPC، Firebase Firestore و سرویسهای داخلی گوگل استفاده میشود.
طرح protobuf پیامهایی با فیلدهای نوعبندی شده را توصیف میکند که هر کدام یک شماره منحصر به فرد دارند. کامپایلر protoc کلاسهایی را در زبان مقصد تولید میکند که سریالسازی و دیسریالسازی را به صورت خودکار انجام میدهند. Protobuf از تکامل طرح از طریق قوانین افزودن و حذف فیلدها بدون از دست دادن سازگاری عقبگرد پشتیبانی میکند.
// تعریف طرح در user.proto
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
repeated string roles = 4;
}
// کد تولید شده در Kotlin
val user = UserProto.User.newBuilder()
.setId(1)
.setName("John")
.setEmail("john@test.com")
.build()
val bytes: ByteArray = user.toByteArray()
XML (eXtensible Markup Language) فرمتی با ساختار سختگیرانه، پشتیبانی از فضاهای نام و اعتبارسنجی از طریق طرحهای XSD است. XML از نظر فشردگی و سرعت تجزیه از JSON عقبتر است، اما در توسعه Android برای فایلهای layout، AndroidManifest، منابع و پیکربندیهای Gradle همچنان مورد استفاده قرار میگیرد. در iOS، XML در فایلهای plist و برخی سرویسهای قدیمی استفاده میشود.
Android سه روش برای تجزیه XML ارائه میدهد: DOM (بارگذاری کل سند در حافظه)، SAX (تجزیه جریانی رویدادمحور) و XmlPullParser (رویکرد ترکیبی). XmlPullParser گزینه توصیه شده برای دستگاههای موبایل است، زیرا با حافظه محدود به طور کارآمد کار میکند و امکان پردازش سند را در حین خواندن فراهم میکند.
// XmlPullParser در Android
fun parseUserXml(inputStream: InputStream): User? {
val parser = Xml.newPullParser()
parser.setInput(inputStream, Xml.Encoding.UTF_8.name)
var id: Int? = null
var name: String? = null
var email: String? = null
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.eventType == XmlPullParser.START_TAG
&& parser.name == "email") {
email = parser.nextText()
}
}
return User(id!!, name!!, email!!)
}
هر پلتفرم ابزارهای خاص خود را برای سریالسازی ارائه میدهد. در iOS، مکانیزم اصلی پروتکل Codable با JSONEncoder و JSONDecoder است و برای Objective-C — NSJSONSerialization. Android از کتابخانههای Gson، Moshi و kotlinx.serialization استفاده میکند. برای انتقال داده بین فرآیندها، Android از Parcelable و iOS از NSKeyedArchiver استفاده میکند. پروژههای Kotlin به طور فزایندهای kotlinx.serialization را انتخاب میکنند — راهحلی از JetBrains که از چندپلتفرمی پشتیبانی میکند و به بازتاب وابسته نیست و سریالسازها را در مرحله کامپایل از طریق پلاگین کامپایلر Kotlin تولید میکند.
Android از دو مکانیزم سریالسازی برای Intent و Bundle پشتیبانی میکند. Serializable مکانیزم استاندارد جاوا است که از بازتاب استفاده میکند و منجر به عملکرد پایین میشود. Parcelable پروتکلی مخصوص Android است که نیاز به پیادهسازی دستی متدهای writeToParcel و createFromParcel دارد، اما به دلیل دستکاری مستقیم بایتها دهها برابر سریعتر کار میکند.
// Parcelable در Android
@Parcelize
data class UserParcel(
val id: Int,
val name: String,
val email: String
) : Parcelable
// انتقال از طریق Intent
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", userParcel)
startActivity(intent)
در iOS برای انتقال داده بین کنترلرها از Codable با سریالسازی قبلی به Data استفاده میشود و برای ارتباط بین فرآیندی — NSKeyedArchiver که اشیاء را به فرمت باینری Property List تبدیل میکند. پروژههای مدرن در SwiftUI ترجیح میدهند دادهها را از طریق JSONEncoder برای انتقال بین ماژولهای برنامه کدگذاری کنند.
دیسریالسازی نادرست دادههای غیرقابل اعتماد میتواند منجر به آسیبپذیریها شود. حملات از طریق سریالسازی از متدهای بازنویسی شده readObject در جاوا یا دیسریالسازهای ناامن کتابخانههای شخص ثالث بهرهبرداری میکنند. در Android باید از Serializable برای دادههای منابع غیرقابل اعتماد اجتناب کرد و به جای آن از Parcelable یا اعتبارسنجی دستی تمام فیلدها پس از دیسریالسازی استفاده کرد. در iOS، JSONDecoder به طور پیشفرض نسبت به انواع سختگیر است، اما هنگام کار با JSONSerialization توسعهدهنده باید انواع را از طریق تبدیل شرطی بررسی کند.
هنگام انتخاب فرمت سریالسازی، الزامات مربوط به عملکرد، حجم داده و سازگاری در نظر گرفته میشود. برای REST API و معماری میکروسرویسها، انتخاب بهینه JSON باقی میماند — توسط تمام پلتفرمها و زبانها پشتیبانی میشود. برای سیستمهای پربار و برنامههای موبایل با ترافیک محدود، Protocol Buffers ترجیح داده میشوند که حجم کمتر و دیسریالسازی سریعتری را فراهم میکنند. XML فقط در سناریوهای پیکربندی و یکپارچگی با سیستمهای قدیمی توجیهپذیر است. در پروژههای مدرن، FlatBuffers نیز محبوبیت پیدا میکند — فرمت باینری بدون مرحله دیسریالسازی که در موتورهای بازی و برنامههای با تأخیر حداقل استفاده میشود. هر فرمت جایگاه خود را دارد و انتخاب صحیح مستقیماً بر سرعت عملکرد برنامه و حجم ترافیک مصرفی تأثیر میگذارد.
سوالات متداول
سریالسازی بستهبندی شیء برنامه در قالبی است که میتوان از طریق شبکه ارسال کرد یا در فایل ذخیره نمود. تصور کنید از یک شیء عکس میگیرید — عکس سریالسازی است و بازسازی شیء از روی عکس دیسریالسازی است.
JSON یک فرمت متنی قابل خواندن برای انسان و بدون نیاز به طرح است. Protocol Buffers یک فرمت باینری با طرح اجباری (.proto)، حجم بسیار کمتر و سرعت بالاتر است. Protobuf برای سیستمهای پربار انتخاب میشود، JSON برای سازگاری جهانی.
XML استاندارد برای فایلهای پیکربندی (AndroidManifest، منابع layout)، اسناد با تو در تویی پیچیده و سیستمهای با اعتبارسنجی سختگیرانه از طریق XSD باقی میماند. XML همچنین در پروتکلهای SOAP و سیستمهای قدیمی که نیاز به پشتیبانی از فضاهای نام دارند استفاده میشود.
Codable پروتکل Swift است که Encodable و Decodable را برای سریالسازی و دیسریالسازی خودکار ترکیب میکند. کامپایلر پیادهسازی متدهای encode(to:) و init(from:) را برای تمام ویژگیهای ساختار یا کلاس تولید میکند.
Parcelable به طور قابل توجهی سریعتر از Serializable کار میکند، زیرا از بازتاب استفاده نمیکند و فیلدها را مستقیماً در جریان بایت مینویسد. در دستگاههای مدرن، تفاوت میتواند به 10 برابر شتاب به نفع Parcelable برسد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید