Serializasiya — obyektin və ya məlumat strukturunun şəbəkə üzərində ötürülməsi və ya fayla yazılması üçün ardıcıl formata çevrilməsi prosesidir. Əks proses, deserializasiya, məlumatları ilkin vəziyyətinə qaytarır. MDN Web Docs məlumatlarına görə, serializasiya istənilən proseslərarası ünsiyyət üçün zəruridir. Serializasiya REST API, keşləmə və tətbiq komponentləri arasında məlumat mübadiləsinin əsasındadır.
Əsas məqamlar
Serializasiya — operativ yaddaşda olan obyektin şəbəkə üzərində ötürülə, fayla yazıla və ya başqa prosesə ötürülə bilən xətti bayt və ya simvol ardıcıllığına çevrilməsi prosesidir. Serializasiya olmadan şəbəkə rabitəsi, vəziyyətin saxlanması və proseslərarası ünsiyyət mümkün deyil.
Serializasiya iki əks prosesi əhatə edir. Birbaşa proses (serializasiya) məlumatları ötürülmə üçün formata yığır. Əks proses (deserializasiya) məlumatları yenidən obyektə qaytarır. Deserializasiya təhlükəsizlik üçün kritikdir: səhv giriş məlumatları tətbiqdə zəifliklərə səbəb ola bilər.
Mobil tətbiqlərin inkişafında serializasiya hər yerdə istifadə olunur: serverə sorğular göndərmək və cavabları emal etmək, ekranın döndərilməsi zamanı tətbiq vəziyyətini saxlamaq, diskdə məlumatları keşləmək və Intent (Android) və ya Segue (iOS) vasitəsilə ekranlar arasında məlumat ötürmək.
Serializasiya formatları mətn və ikilik olaraq bölünür. Mətn formatları (JSON, XML) insan tərəfindən oxuna bilir və baxış üçün alətlər tələb etmir. İkilik formatlar (Protobuf, FlatBuffers, MessagePack) daha yığcam və sürətli, lakin deserializasiya olmadan oxunmaz. Format seçimi məhsuldarlıq vɐ debug rahatlığı arasında kompromisdir.
JSON, XML və Protobuf-dan əlavə, ixtisaslaşmış formatlar da var: Google-dan FlatBuffers oyunlar və AR üçün, MessagePack — JSON-un yığcam ikilik analoqu, Apache-dən Avro Kafka-da böyük məlumatlar üçün, YAML — şərh dəstəyi olan konfiqurasiya formatı.
| Format | Tip | Sxem | Ölçü | Sürət |
|---|---|---|---|---|
| JSON | Mətn | İstəyə bağlı | Orta | Orta |
| XML | Mətn | XSD | Böyük | Aşağı |
| Protobuf | İkilik | Məcburi | Kiçik | Yüksək |
| FlatBuffers | İkilik | Məcburi | Kiçik | Maksimal |
| MessagePack | İkilik | Xeyr | Kiçik | Yüksək |
| Avro | İkilik | JSON Schema | Kiçik | Yüksək |
Serializasiya mobil platformalarda özünəməxsus xüsusiyyətlərə malikdir: məhdud trafik, zəif prosessorlar və ekranın döndərilməsi zamanı vəziyyətin saxlanması zərurəti. Android-də Gson, Moshi, Kotlinx Serialization istifadə olunur. iOS-da — Codable, JSONSerialization, PropertyListEncoder. Kitabxananın düzgün seçimi tətbiqin məhsuldarlığına kritik təsir göstərir.
Kotlinx Serialization — JetBrains-dən Kotlin Multiplatform Mobile üçün müasir kitabxana. JSON, Protobuf, CBOR və fərdi formatları dəstəkləyir. Kod yaradılması Kotlin Serialization plaqini vasitəsilə kompilasiya mərhələsində baş verir və refleksiya olmadan yüksək məhsuldarlıq təmin edir.
Kotlinx Serialization kitabxanası siniflər üçün @Serializable annotasiyasından və serializatorları yaratmaq üçün kompilator plaginindən istifadə edir. Bu, yüksək məhsuldarlıq və tip təhlükəsizliyi təmin edir. Defolt format JSON-dur, lakin əlavə modullar vasitəsilə digər formatlar da dəstəklənir.
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)
// Seriyalaşdırma
val jsonString = json.encodeToString(project)
// Deseriyalaşdırma
val restored = json.decodeFromString<Project>(jsonString)
}
Codable protokolu — Swift-də daxili serializasiya mexanizmi. O, Encodable (serializasiya) və Decodable (deserializasiya) protokollarını birləşdirir. JSONEncoder və JSONDecoder avtomatik olaraş iç-içə quruluşları, massivləri, opsional dəyərləri və CodingKeys vasitəsilə fərdi açarları emal edir.
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)
Məhsuldarlıq serializasiya formatları üç metrik üzrə qiymətləndirilir: mesaj ölçüsü, serializasiya sürəti və deserializasiya sürəti. Mobil tətbiqlər üçün hüçü kritikdir: ölçü trafik və yüklənmə müddətinə, sürət interfeysin cavabdehliyinə və tətbiqin işə düşmə müddətinə təsir edir.
Protobuf və FlatBuffers ikilik təmsil sayəsində ən yaxşı nəticələri göstərir. FlatBuffers ayrıca deserializasiya mərhələsi tələb etməməsi ilə fərqlənir — məlumatlar birbaşa ikilik buferdən oxunur, bu minimal gecikmə tələb edən oyunlar və AR tətbiqləri üçün idealdır. JSON, daha aşağı məhsuldarlığa baxmayaraq, sadəliyi və universallığı sayəsində REST API üçün ən populyar format olaraq qalır.
| Ssenari | Tövsiyə olunan format | Səbəb |
|---|---|---|
| REST API | JSON | Universallıq, oxunaqlılıq, dəstək |
| Mikroservislər | Protobuf | Yığcamlıq, sürət, gRPC |
| Oyunlar / AR | FlatBuffers | Zero-copy, minimal gecikmə |
| Big Data | Avro | Kafka və Hadoop ilə uyğunluq |
| Konfiqurasiya | YAML | Şərhlər, oxunaqlılıq |
| Android layouts | XML | Platforma standartı |
1000 istifadəçi obyekti üzrə praktiki testlər göstərir: Protobuf 12 KB ölçüsündə mesajlar yaradır (JSON — 85 KB, XML — 120 KB). Serializasiya müddəti: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Bu rəqəmlər ikilik formatları yüksək yüklü sistemlər və məhdud trafikli mobil tətbiqlər üçün üstün edir.
Nümunələr eyni obyektin müxtəlif formatlarda serializasiyasını nümayiş etdirir. Bu, ölçü və oxunaqlılığı vizual olaraş müqayisə etməyə kömək edir. Eyni User obyekti JSON, XML və Protobuf-da serializasiya olunacaq — görünür şəkildə JSON XML-dən daha yığcam, Protobuf isə hamısından yığcam və eyni zamanda oxunmazdır.
JSON — minimal sintaksis, açarlar dırnıq içərisində, müxtəlif tipli dəyərlər. 80 simvol yer tutur. Oxunaqlılıq yüksək, vizual quruluş aydındır. İnkişaf və debug sürətinin vacib olduğu API üçün uyğundur.
XML — hər element açılış və bağlanış teqlərinə bürünür. 150 simvol yer tutur. Oxunaqlılıq orta, quruluş ciddidir. Sənəd dövriyyəsi və XSD vasitəsilə validasiya tələb edən sistemlər üçün uyğundur.
Protobuf — ikilik, bu məlumatlar üçün 32 bayt. Oxunmaz — baxış üçün deserializasiya tələb edir. Minimal ölçüsü onu yüksək yüklü sistemlər və mobil tətbiqlər üçün ideal edir.
{
"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>
Ən yaxşı təcrübələr tipik səhvlərdən qaçmağa və layihə üçün düzgün serializasiya strategiyası seçməyə kömək edir. Bu tövsiyələrə əməl etmək məhsuldarlığı, təhlükəsizliyi və kodun davamlılığını yaxşılaşdırır.
Serializasiya təhlükəsizliyi xüsusilə etibarsız mənbələrdən məlumatların deserializasiyası zamanı kritik əhəmiyyət daşıyır. Deserializasiya hücumları uzaqdan kod icrasına (RCE) səbəb ola bilər ki, bu da veb və mobil tətbiqlərdə ən təhlükəli zəifliklərdən biridir. Ən məşhur hallar Java Serializable və Python pickle ilə bağlıdır.
Protobuf və JSON bu cür hücumlara qarşı daxili qorumaya malikdir, çünki onlar yalnız məlumatlarla işləyir, ixtiyari obyektlərlə deyil. Java Serializable isə əksinə, classpath-də mövcud olan istənilən sinfi bə9a edə bilər ki, bu da onu xarici mənbələrdən məlumat qəbul etmək üçün təhlükəli edir. Android-də standart Java Serialization əvəzinə Kotlinx Serialization və ya Moshi istifadə etmək tövsiyə olunur.
Əlavə təhlükəsizlik tədbirləri: giriş məlumatlarının ölçüsünə limit qoyun, deserializasiyadan əvvəl sxemi validasiya edin, HTTP başlıqlarındakı Content-Type-a etibar etməyin, icazə verilən siniflər üçün allowlist istifadə edin. Serializasiya kitabxanalarını mütəmadi yeniləyin, çünki onlarda zəifliklər vaxtaşırı aşkarlanır və düzəldilir.
Tez-tez verilən suallar
Serializasiya obyekti bayt ardıcıllığına çevirir, marşallinq (marshalling) isə məlumatları tipləri və quruluşu qoruyaraq müxtəlif ünvan məkanları arasında ötürür. Marşallinq serializasiyanı prosesin bir hissəsi kimi əhatə edir, lakin həmçinin istinadların kodlaşdırılması və yaddaş idarəçiliyini də əhatə edə bilər.
Google-dan FlatBuffers zero-copy deserializasiyası sayəsində maksimal sürət təmin edir — məlumatlar çevrilmə olmadan birbaşa ikilik buferdən oxunur. Protobuf ikinci, JSON üçüncü yerdədir. XML yayılmış formatlar arasında ən yavaşıdır.
Kotlinx Serialization Kotlin-də yeni layihələr üçün ən yaxşı seçimdir: kompilator generasiyası, Kotlin Multiplatform dəstəyi, null safety. Moshi Java layihələri üçün yaxşı seçimdir, Gson-dan daha məhsuldardır. Gson başlanğıc üçün ən sadə kitabxanadır, lakin daha yavaşdır və refleksiyadan istifadə edir.
Dövri istinadlar serializasiyada sonsuz rekursiyaya səbəb olur. Həll yolları: obyektlərə birbaşa istinadlar əvəzinə ID istinadlarından istifadə edin, xüsusi serializasiya adapterləri tətbiq edin (məsələn, Jackson-da @JsonIgnore) və ya dövrləri aradan qaldırmaq üçün məlumat modelini yenidən dizayn edin.
Bəli, xüsusilə etibarsız mənbələrdən məlumatların deserializasiyası. Deserializasiya zəiflikləri uzaqdan kod icrasına səbəb ola bilər. Tövsiyələr: etibarsız mənbələrdən məlumatları deserializasiya etməyin, deserializasiya zamanı sinif allowlist-indən istifadə edin və emaldan əvvəl məlumat sxemini validasiya edin.
Nəticələr
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun