Serializatsiya — ob'ekt yoki ma'lumotlar strukturasini tarmoq orqali uzatish yoki faylga saqlash uchun mos keladigan ketma-ket formatga aylantirish jarayoni. Teskari jarayon, deserializatsiya, ma'lumotlarni asl holatiga qaytaradi. MDN Web Docs ma'lumotlariga ko'ra, serializatsiya har qanday jarayonlararo aloqa uchun zarur. Serializatsiya REST API, keshlash va ilova komponentlari o'rtasida ma'lumot almashish asosida yotadi.
Asosiy fikrlar
Serializatsiya — operativ xotiradagi ob'ektni tarmoq orqali uzatish, faylga saqlash yoki boshqa jarayonga jo'natish mumkin bo'lgan chiziqli bayt yoki belgilar ketma-ketligiga aylantirish jarayoni. Serializatsiyasiz tarmoq aloqasi, holatni saqlash va jarayonlararo aloqa mumkin emas.
Serializatsiya ikkita qarama-qarshi jarayonni o'z ichiga oladi. To'g'ri jarayon (serializatsiya) ma'lumotlarni uzatish uchun formatga joylaydi. Teskari jarayon (deserializatsiya) ma'lumotlarni qaytadan ob'ektga tiklaydi. Deserializatsiya xavfsizlik uchun muhim: noto'g'ri kiritilgan ma'lumotlar ilovada zaifliklarga olib kelishi mumkin.
Mobil ilovalarni ishlab chiqishda serializatsiya hamma joyda qo'llaniladi: serverga so'rovlar yuborish va javoblarni qayta ishlash, ekran aylantirilganda ilova holatini saqlash, diskdagi ma'lumotlarni keshlash va Intent (Android) yoki Segue (iOS) orqali ekranlar o'rtasida ma'lumot uzatish.
Serializatsiya formatlari matn va ikkilikka bo'linadi. Matn formatlari (JSON, XML) odam tomonidan o'qilishi mumkin va ko'rish uchun vositalar talab qilmaydi. Ikkilik formatlar (Protobuf, FlatBuffers, MessagePack) ixchamroq va tezroq, ammo deserializatsiyasiz o'qib bo'lmaydi. Format tanlash unumdorlik va disk raskadrovka qulayligi o'rtasidagi kelishuvdir.
JSON, XML va Protobufdan tashqari, ixtisoslashtirilgan formatlar ham mavjud: Google'dan FlatBuffers o'yinlar va AR uchun, MessagePack — JSON ning ixcham ikkilik analogi, Apache'dan Avro Kafkadagi katta ma'lumotlar uchun, YAML — sharhlarni qo'llab-quvvatlovchi konfiguratsiya formati.
| Format | Tur | Sxema | Hajm | Tezlik |
|---|---|---|---|---|
| JSON | Matn | Ixtiyoriy | O'rta | O'rta |
| XML | Matn | XSD | Katta | Past |
| Protobuf | Ikkilik | Majburiy | Kichik | Yuqori |
| FlatBuffers | Ikkilik | Majburiy | Kichik | Maksimal |
| MessagePack | Ikkilik | Yo'q | Kichik | Yuqori |
| Avro | Ikkilik | JSON Schema | Kichik | Yuqori |
Serializatsiya mobil platformalarda o'ziga xos xususiyatlarga ega: cheklangan trafik, zaif protsessorlar va ekran aylantirilganda holatni saqlash zarurati. Androidda Gson, Moshi, Kotlinx Serialization ishlatiladi. iOSda — Codable, JSONSerialization, PropertyListEncoder. Kutubxonani to'g'ri tanlash ilova unumdorligiga jiddiy ta'sir qiladi.
Kotlinx Serialization — JetBrains'dan Kotlin Multiplatform Mobile uchun zamonaviy kutubxona. JSON, Protobuf, CBOR va moslashtirilgan formatlarni qo'llab-quvvatlaydi. Kod yaratish Kotlin Serialization plagini orqali kompilyatsiya bosqichida amalga oshiriladi, bu reflektsiyasiz yuqori unumdorlikni ta'minlaydi.
Kotlinx Serialization kutubxonasi sinflar uchun @Serializable annotatsiyasidan va serializatorlarni yaratish uchun kompilyator plaginidan foydalanadi. Bu yuqori unumdorlik va tip xavfsizligini ta'minlaydi. Standart format JSON, ammo qo'shimcha modullar orqali boshqa formatlar ham qo'llab-quvvatlanadi.
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)
// Seriyalash
val jsonString = json.encodeToString(project)
// Deserializatsiya
val restored = json.decodeFromString<Project>(jsonString)
}
Codable protokoli — Swift'da o'rnatilgan serializatsiya mexanizmi. U Encodable (serializatsiya) va Decodable (deserializatsiya) protokollarini birlashtiradi. JSONEncoder va JSONDecoder avtomatik ravishda ichma-ich tuzilmalar, massivlar, ixtiyoriy qiymatlar va CodingKeys orqali maxsus kalitlarni qayta ishlaydi.
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)
Unumdorlik serializatsiya formatlari uchta ko'rsatkich bo'yicha baholanadi: xabar hajmi, serializatsiya tezligi va deserializatsiya tezligi. Mobil ilovalar uchun uchalasi ham muhim: hajm trafik va yuklanish vaqtiga, tezlik interfeysning sezgirligi va ilovani ishga tushirish vaqtiga ta'sir qiladi.
Protobuf va FlatBuffers ikkilik ko'rinish tufayli eng yaxshi natijalarni ko'rsatadi. FlatBuffers alohida deserializatsiya bosqichini talab qilmasligi bilan ajralib turadi — ma'lumotlar to'g'ridan-to'g'ri ikkilik buferdan o'qiladi, bu minimal kechikish talab qiladigan o'yinlar va AR ilovalari uchun idealdir. JSON, pastroq unumdorlikka qaramay, soddaligi va universalligi tufayli REST API uchun eng mashhur format bo'lib qolmoqda.
| Ssenariy | Tavsiya etilgan format | Sabab |
|---|---|---|
| REST API | JSON | Universallik, o'qiluvchanlik, qo'llab-quvvatlash |
| Mikrosxizmatlar | Protobuf | Ixchamlik, tezlik, gRPC |
| O'yinlar / AR | FlatBuffers | Zero-copy, minimal kechikish |
| Big Data | Avro | Kafka va Hadoop bilan moslik |
| Konfiguratsiya | YAML | Sharhlar, o'qiluvchanlik |
| Android layouts | XML | Platforma standarti |
1000 ta foydalanuvchi ob'ektlaridan iborat to'plamda amaliy testlar ko'rsatadi: Protobuf 12 KB hajmdagi xabarlarni yaratadi (JSON — 85 KB, XML — 120 KB). Serializatsiya vaqti: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Bu raqamlar ikkilik formatlarni yuqori yuklangan tizimlar va cheklangan trafikli mobil ilovalar uchun afzal qiladi.
Misollar bir xil ob'ektning turli formatlarda serializatsiyasini namoyish etadi. Bu hajm va o'qiluvchanlikni vizual ravishda solishtirishga yordam beradi. Xuddi shu User ob'ekti JSON, XML va Protobuf'da serializatsiya qilinadi — JSON XML'dan ixchamroq, Protobuf esa eng ixcham va bir vaqtning o'zida o'qib bo'lmaydigan ekanligi aniq ko'rinadi.
JSON — minimal sintaksis, kalitlar qo'shtirnoq ichida, har xil turdagi qiymatlar. 80 belgidan iborat. O'qiluvchanligi yuqori, vizual tuzilishi aniq. Ishlab chiqish va disk raskadrovka tezligi muhim bo'lgan API uchun mos keladi.
XML — har bir element ochilish va yopilish teglariga o'ralgan. 150 belgidan iborat. O'qiluvchanligi o'rtacha, tuzilishi qat'iy. Hujjat aylanishi va XSD orqali validatsiya talab qiladigan tizimlar uchun mos keladi.
Protobuf — ikkilik, bu ma'lumotlar uchun 32 bayt. O'qib bo'lmaydi — ko'rish uchun deserializatsiya talab qiladi. Minimal hajmi uni yuqori yuklangan tizimlar va mobil ilovalar uchun ideal qiladi.
{
"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>
Eng yaxshi amaliyotlar odatiy xatolardan qochish va loyiha uchun to'g'ri serializatsiya strategiyasini tanlashga yordam beradi. Ushbu tavsiyalarga rioya qilish unumdorlik, xavfsizlik va kodning barqarorligini yaxshilaydi.
Serializatsiya xavfsizligi — ayniqsa ishonchsiz manbalardan ma'lumotlarni deserializatsiya qilishda juda muhim jihat. Deserializatsiyaga hujumlar masofaviy kod bajarilishiga (RCE) olib kelishi mumkin, bu veb va mobil ilovalardagi eng xavfli zaifliklardan biridir. Eng mashhur holatlar Java Serializable va Python pickle bilan bog'liq.
Protobuf va JSON bunday hujumlardan o'rnatilgan himoyaga ega, chunki ular faqat ma'lumotlar bilan ishlaydi, ixtiyoriy ob'ektlar bilan emas. Java Serializable esa, aksincha, classpath'da mavjud bo'lgan har qanday sinfni tiklashi mumkin, bu uni tashqi manbalardan ma'lumot qabul qilish uchun xavfli qiladi. Androidda standart Java Serialization o'rniga Kotlinx Serialization yoki Moshi'dan foydalanish tavsiya etiladi.
Qo'shimcha xavfsizlik choralari: kirish ma'lumotlari hajmiga cheklov qo'ying, deserializatsiyadan oldin sxemani tekshiring, HTTP sarlavhalaridagi Content-Type'ga ishonmang, ruxsat etilgan sinflar uchun allowlist'dan foydalaning. Serializatsiya kutubxonalarini muntazam yangilang, chunki ulardagi zaifliklar vaqti-vaqti bilan aniqlanadi va tuzatiladi.
Tez-tez beriladigan savollar
Serializatsiya ob'ektni baytlar ketma-ketligiga aylantiradi, marshalling (marshalling) ma'lumotlarni turlari va tuzilishini saqlagan holda turli manzil fazolari o'rtasida uzatadi. Marshalling serializatsiyani jarayonning bir qismi sifatida o'z ichiga oladi, ammo shuningdek havolalarni kodlash va xotira boshqaruvini ham o'z ichiga olishi mumkin.
Google'dan FlatBuffers zero-copy deserializatsiyasi tufayli maksimal tezlikni ta'minlaydi — ma'lumotlar o'zgartirilmasdan to'g'ridan-to'g'ri ikkilik buferdan o'qiladi. Protobuf ikkinchi, JSON uchinchi o'rinda. XML tarqalgan formatlar orasida eng sekinidir.
Kotlinx Serialization Kotlin'dagi yangi loyihalar uchun eng yaxshi tanlov: kompilyatorda yaratish, Kotlin Multiplatform qo'llab-quvvatlashi, null safety. Moshi Java loyihalari uchun yaxshi tanlov, Gson'dan unumliroq. Gson boshlash uchun eng oddiy kutubxona, ammo sekinroq va refleksiyadan foydalanadi.
Tsiklik havolalar serializatsiyada cheksiz rekursiyaga olib keladi. Yechimlar: ob'ektlarga to'g'ridan-to'g'ri havolalar o'rniga ID havolalaridan foydalaning, maxsus serializatsiya adapterlarini qo'llang (masalan, Jacksondagi @JsonIgnore) yoki tsikllarni bartaraf etish uchun ma'lumotlar modelini qayta loyihalashtiring.
Ha, ayniqsa ishonchsiz manbalardan ma'lumotlarni deserializatsiya qilish. Deserializatsiya zaifliklari masofaviy kod bajarilishiga olib kelishi mumkin. Tavsiyalar: ishonchsiz manbalardan ma'lumotlarni deserializatsiya qilmang, deserializatsiya paytida sinf allowlistidan foydalaning va qayta ishlashdan oldin ma'lumotlar sxemasini tekshiring.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.