Serializatsiya va deserializatsiya — ob'ektlarni uzatish yoki saqlash uchun formatga aylantirishning asosiy jarayonlari. Mobil ishlanmada bu mexanizmlar har bir tarmoq so'rovida, holatni saqlashda va jarayonlararo aloqada qo'llaniladi. MDN Web Docs, 2024 ma'lumotlariga ko'ra, JSON eng mashhur format bo'lib qolmoqda veb va mobil ilovalarda serializatsiya uchun, XML va Protocol Buffers-ni ortda qoldirib.
Asosiy
Serializatsiya — bu ilova ob'ektini tarmoq orqali uzatish yoki diskda saqlash uchun yaroqli formatga aylantirish jarayoni. Deserializatsiya teskari aylantirishni amalga oshiradi, olingan ma'lumotlardan ob'ektni tiklaydi. Mobil ishlanmada serializatsiya API so'rovlarida, ekran holatini saqlashda, keshlashda va Intent yoki Bundle orqali ma'lumot uzatishda qo'llaniladi.
Ilova komponentlari yoki ilova va server o'rtasidagi har bir o'zaro aloqa serializatsiyani talab qiladi. REST API ma'lumotlarni JSON yoki XML da uzatadi, gRPC Protocol Buffers-dan foydalanadi, Android-da jarayon ichidagi aloqa esa Parcelable-ni qo'llaydi. Serializatsiyasiz murakkab ob'ektni jarayon chegarasidan o'tkazish yoki uni ma'lumotlar bazasida saqlash mumkin emas.
// Serializatsiyaning umumiy prinsipi
data class User(
val id: Int,
val name: String,
val email: String
)
// Serializatsiya: ob'ekt -> JSON
fun serializeUser(user: User): String {
return """{"id":${user.id},"name":"${user.name}","email":"${user.email}"}"""
}
// Deserializatsiya: JSON -> ob'ekt
fun deserializeUser(json: String): User? {
// JSON-ni ob'ektga pars qilish
return Gson().fromJson(json, User::class.java)
}
| Format | O'lcham | Tezlik | O'qish qulayligi | Tipizatsiya |
|---|---|---|---|---|
| JSON | o'rta | yuqori | yuqori | dinamik |
| XML | katta | o'rta | yuqori | XSD sxemasi |
| Protocol Buffers | kichik | juda yuqori | past | qat'iy .proto |
| FlatBuffers | kichik | maksimal | past | qat'iy .fbs |
JSON (JavaScript Object Notation) — JavaScript ob'ektlari sintaksisiga asoslangan yengil matn formati. JSON satrlar, raqamlar, mantiqiy qiymatlar, massivlar va ichma-ich ob'ektlarni qo'llab-quvvatlaydi, bu mobil ilovalarda ma'lumot uzatishning aksariyat ssenariylarini qamrab oladi. Format platformadan mustaqil: har bir ekotizim uni pars qilish uchun o'rnatilgan vositalarni taqdim etadi.
JSON soddaligi va universalligi tufayli g'alaba qozonadi. Dasturchiga asosiy foydalanish uchun sxema kerak emas — struktura pars qilish paytida dinamik ravishda aniqlanadi. Formatning o'qish qulayligi disk raskadrovka va test qilishni soddalashtiradi: server javobini istalgan dasturchi vositasida ko'rish mumkin. Ikkala mobil platformada ham JSON uchinchi tomon kutubxonalarisiz native tarzda qayta ishlanadi.
// Codable — Swift-da native JSON serializatsiyasi
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) — yuqori samaradorlik tizimlari uchun Google tomonidan ishlab chiqilgan ikkilik serializatsiya formati. JSON-dan farqli o'laroq, protobuf .proto faylida sxemani oldindan belgilashni talab qiladi, lekin sezilarli darajada kichikroq ma'lumot hajmi va yuqoriroq qayta ishlash tezligini ta'minlaydi. Format gRPC, Firebase Firestore va Google-ning ichki xizmatlarida qo'llaniladi.
Protobuf sxemasi har biri noyob raqamga ega tiplangan maydonlari bo'lgan xabarlarni tavsiflaydi. Protoc kompilyatori kerakli tilda sinflarni yaratadi, ular serializatsiya va deserializatsiyani avtomatik ravishda bajaradi. Protobuf maydonlarni qo'shish va olib tashlash qoidalari orqali orqaga moslikni yo'qotmasdan sxema evolyutsiyasini qo'llab-quvvatlaydi.
// user.proto-da sxemani belgilash
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
repeated string roles = 4;
}
// Kotlin-da yaratilgan kod
val user = UserProto.User.newBuilder()
.setId(1)
.setName("John")
.setEmail("john@test.com")
.build()
val bytes: ByteArray = user.toByteArray()
XML (eXtensible Markup Language) — qat'iy tuzilishga, nom fazolarini qo'llab-quvvatlashga va XSD sxemalari orqali validatsiyaga ega format. XML ixchamlik va pars qilish tezligi bo'yicha JSON-dan orqada qoladi, lekin Android ishlanmasida layout fayllari, AndroidManifest, resurslar va Gradle konfiguratsiyalari uchun talab qilinadi. iOS-da XML plist fayllarida va ba'zi eski xizmatlarda qo'llaniladi.
Android XML-ni pars qilish uchun uchta usulni taklif qiladi: DOM (butun hujjatni xotiraga yuklash), SAX (hodisaga yo'naltirilgan oqimli pars qilish) va XmlPullParser (gibrid yondashuv). XmlPullParser — mobil qurilmalar uchun tavsiya etilgan variant, chunki u cheklangan xotira bilan samarali ishlaydi va hujjatni o'qish bilan birga qayta ishlash imkonini beradi.
// Android-da XmlPullParser
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!!)
}
Har bir platforma serializatsiya uchun o'z vositalarini taklif qiladi. iOS-da asosiy mexanizm JSONEncoder va JSONDecoder bilan Codable protokoli, Objective-C uchun esa NSJSONSerialization. Android Gson, Moshi va kotlinx.serialization kutubxonalaridan foydalanadi. Jarayonlararo ma'lumot uzatish uchun Android Parcelable, iOS esa NSKeyedArchiver qo'llaydi. Kotlin loyihalari tobora ko'proq kotlinx.serialization — JetBrains-ning yechimini tanlaydi, bu ko'p platformalilikni qo'llab-quvvatlaydi va refleksiyaga bog'liq emas, Kotlin kompilyator plagini orqali kompilyatsiya bosqichida serializatorlar yaratadi.
Android Intent va Bundle uchun ikkita serializatsiya mexanizmini qo'llab-quvvatlaydi. Serializable — refleksiyadan foydalanadigan standart Java mexanizmi, bu past samaradorlikka olib keladi. Parcelable — Android-ga xos protokol, writeToParcel va createFromParcel metodlarini qo'lda amalga oshirishni talab qiladi, lekin baytlar bilan to'g'ridan-to'g'ri manipulyatsiya tufayli o'nlab marta tezroq ishlaydi.
// Android-da Parcelable
@Parcelize
data class UserParcel(
val id: Int,
val name: String,
val email: String
) : Parcelable
// Intent orqali uzatish
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", userParcel)
startActivity(intent)
iOS-da kontrollerlar o'rtasida ma'lumot uzatish uchun Codable oldindan Data-ga serializatsiya bilan, jarayonlararo aloqa uchun esa NSKeyedArchiver ishlatiladi, u ob'ektlarni Property List ikkilik formatiga aylantiradi. SwiftUI-dagi zamonaviy loyihalar ilova modullari o'rtasida uzatish uchun ma'lumotlarni JSONEncoder orqali kodlashni afzal ko'radi.
Ishonchsiz ma'lumotlarning noto'g'ri deserializatsiyasi zaifliklarga olib kelishi mumkin. Serializatsiya orqali hujumlar Java-da readObject metodining o'zgartirilishidan yoki uchinchi tomon kutubxonalarining xavfli deserializatorlaridan foydalanadi. Android-da ishonchsiz manbalardan olingan ma'lumotlar uchun Serializable-dan qochish, uning o'rniga Parcelable yoki deserializatsiyadan keyin barcha maydonlarni qo'lda tekshirish tavsiya etiladi. iOS-da JSONDecoder sukut bo'yicha turlarga nisbatan qat'iy, lekin JSONSerialization bilan ishlaganda dasturchi shartli aylantirish orqali turlarni tekshirishi kerak.
Serializatsiya formatini tanlashda samaradorlik talablari, ma'lumot hajmi va moslik hisobga olinadi. REST API va mikroxizmat arxitekturasi uchun optimal tanlov JSON bo'lib qolmoqda — u barcha platformalar va tillar tomonidan qo'llab-quvvatlanadi. Yuqori yuklangan tizimlar va cheklangan trafikli mobil ilovalar uchun Protocol Buffers afzalroq, ular kichikroq hajm va tezroq deserializatsiyani ta'minlaydi. XML faqat konfiguratsiya ssenariylarida va eski tizimlar bilan integratsiyada asoslanadi. Zamonaviy loyihalarda FlatBuffers ham ommalashmoqda — deserializatsiya bosqichisiz ikkilik format, o'yin dvigatellarida va minimal kechikishli ilovalarda qo'llaniladi. Har bir format o'z o'rniga ega va to'g'ri tanlov bevosita ilovaning ishlash tezligi va iste'mol qilinadigan trafik hajmiga ta'sir qiladi.
Tez-tez beriladigan savollar
Serializatsiya — bu ilova ob'ektini tarmoq orqali yuborish yoki faylda saqlash mumkin bo'lgan formatga yig'ish. Tasavvur qiling, bir buyumning suratini olyapsiz — surat serializatsiya, buyumning suratdan tiklanishi esa deserializatsiya.
JSON — inson o'qiy oladigan va sxema talab qilmaydigan matn formati. Protocol Buffers — majburiy sxemali (.proto), sezilarli darajada kichik hajmli va yuqori tezlikli ikkilik format. Protobuf yuqori yuklangan tizimlar uchun tanlanadi, JSON — universal moslik uchun.
XML konfiguratsiya fayllari (AndroidManifest, layout resurslari), murakkab ichma-ich hujjatlar va XSD orqali qat'iy validatsiyali tizimlar uchun standart bo'lib qolmoqda. XML shuningdek SOAP protokollari va nom fazolarini qo'llab-quvvatlash talab qilinadigan eski tizimlarda qo'llaniladi.
Codable — avtomatik serializatsiya va deserializatsiya uchun Encodable va Decodable-ni birlashtiruvchi Swift protokoli. Kompilyator struktura yoki sinfning barcha xususiyatlari uchun encode(to:) va init(from:) metodlarining amalga oshirilishini yaratadi.
Parcelable Serializable-dan sezilarli darajada tezroq ishlaydi, chunki refleksiyadan foydalanmaydi va maydonlarni to'g'ridan-to'g'ri bayt oqimiga yozadi. Zamonaviy qurilmalarda farq Parcelable foydasiga 10 baravargacha tezlashishga yetishi mumkin.
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.