Serializasiya və deserializasiya — obyektlərin ötürülmə və ya saxlanma üçün formata çevrilməsinin fundamental prosesləridir. Mobil inkişafda bu mexanizmlər hər şəbəkə sorğusunda, vəziyyətin saxlanmasında və proseslərarası ünsiyyətdə istifadə olunur. MDN Web Docs, 2024-e görə, JSON ən məşhur format olaraq qalır veb və mobil tətbiqlərdə serializasiya üçün, XML və Protocol Buffers-ı geridə qoyaraq.
Başlıca
Serializasiya — bu tətbiq obyektinin şəbəkə üzərində ötürülmə və ya diskdə saxlanma üçün yararlı formata çevrilməsi prosesidir. Deserializasiya əks çevrilməni həyata keçirir, alınan məlumatlardan obyekti bərpa edir. Mobil inkişafda serializasiya API sorğularında, ekran vəziyyətinin saxlanmasında, keşləmədə və Intent və ya Bundle vasitəsilə məlumat ötürülməsində tətbiq olunur.
Tətbiq komponentləri və ya tətbiqlə server arasındakı hər bir qarşılıqlı əlaqə serializasiya tələb edir. REST API məlumatları JSON və ya XML-də ötürür, gRPC Protocol Buffers istifadə edir, Android-də prosesdaxili ünsiyyət isə Parcelable tətbiq edir. Serializasiya olmadan mürəkkəb obyekti proses sərhədindən ötürmək və ya onu verilənlər bazasında saxlamaq mümkün deyil.
// Serializasiyanın ümumi prinsipi
data class User(
val id: Int,
val name: String,
val email: String
)
// Serializasiya: obyekt -> JSON
fun serializeUser(user: User): String {
return """{"id":${user.id},"name":"${user.name}","email":"${user.email}"}"""
}
// Deserializasiya: JSON -> obyekt
fun deserializeUser(json: String): User? {
// JSON-un obyektə pars edilməsi
return Gson().fromJson(json, User::class.java)
}
| Format | Ölçü | Sürət | Oxunaqlılıq | Tipizasiya |
|---|---|---|---|---|
| JSON | orta | yüksək | yüksək | dinamik |
| XML | böyük | orta | yüksək | XSD sxemi |
| Protocol Buffers | kiçik | çox yüksək | aşağı | ciddi .proto |
| FlatBuffers | kiçik | maksimal | aşağı | ciddi .fbs |
JSON (JavaScript Object Notation) — JavaScript obyektlərinin sintaksisinə əsaslanan yünül mətn formatıdır. JSON sətrlər, rəqəmlər, məntiqi dəyərlər, massivlər və iç-içə obyektləri dəstəkləyir ki, bu da mobil tətbiqlərdə məlumat ötürülməsinin əksər ssenarilərini əhatə edir. Format platformadan asılı deyil: hər ekosistem onun pars edilməsi üçün daxili vasitələr təqdim edir.
JSON sadəliyi və universallığı sayəsində qalib gəlir. İlkin istifadə üçün tərtibatçıya sxem lazım deyil — struktur pars etmə zamanı dinamik olaraq müəyyən edilir. Formatın oxunaqlılığı sazlama və testi asanlaşdırır: server cavabı istənilən tərtibatçı alətində görünə bilər. Hər iki mobil platformada JSON üçüncü tərəf kitabxanalarına ehtiyac olmadan native şəkildə işlənir.
// Codable — Swift-də native JSON serializasiyası
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) — yüksək performanslı sistemlər üçün Google tərəfindən hazırlanmış ikili serializasiya formatıdır. JSON-dan fərqli olaraq, protobuf .proto faylında sxemin əvvəlcədən müəyyən edilməsini tələb edir, lakin əhəmiyyətli dərəcədə kiçik məlumat ölçüsü və daha yüksək emal sürəti təmin edir. Format gRPC, Firebase Firestore və Google-ın daxili xidmətlərində istifadə olunur.
Protobuf sxemi hər biri unikal nömrəyə malik tipli sahələri olan mesajları təsvir edir. Protoc kompilyatoru tələb olunan dildə siniflər yaradır ki, onlar serializasiya və deserializasiyanı avtomatik yerinə yetirir. Protobuf geriyə uyğumluluğu itirmədən sahələrin əlavə edilməsi və silinməsi qaydaları vasitəsilə sxemin təkamülünü dəstəkləyir.
// user.proto-da sxemin təyini
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
repeated string roles = 4;
}
// Kotlin-də yaradılmış kod
val user = UserProto.User.newBuilder()
.setId(1)
.setName("John")
.setEmail("john@test.com")
.build()
val bytes: ByteArray = user.toByteArray()
XML (eXtensible Markup Language) — ciddi strukturu, ad fəzaları dəstəyi və XSD sxemləri vasitəsilə doğrulaması olan formatdır. XML JSON-dan yığcamlıq və pars etmə sürəti baxımından geri qalır, lakin Android inkişafında layout faylları, AndroidManifest, resurslar və Gradle konfiqurasiyaları üçün tələb olunur. iOS-da XML plist fayllarında və bəzi köhnə xidmətlərdə istifadə olunur.
Android XML-in pars edilməsi üçün üç üsul təqdim edir: DOM (bütün sənədin yaddaşa yüklənməsi), SAX (hadisə yönümlü axın pars etmə) və XmlPullParser (hibrid yanaşma). XmlPullParser — mobil cihazlar üçün tövsiyə olunan seçimdir, çünki məhdud yaddaşla səmərəli işləyir və sənədi oxunduqca emal etməyə imkan verir.
// Android-də 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!!)
}
Hər platforma serializasiya üçün öz alətlərini təklif edir. iOS-da əsas mexanizm JSONEncoder və JSONDecoder ilə Codable protokoludur, Objective-C üçün isə NSJSONSerialization. Android Gson, Moshi və kotlinx.serialization kitabxanalarından istifadə edir. Proseslərarası məlumat ötürülməsi üçün Android Parcelable, iOS isə NSKeyedArchiver tətbiq edir. Kotlin layihələri getdikcə daha çox kotlinx.serialization — JetBrains-in həllini seçir, bu da çoxplatformalılığı dəstəkləyir və refleksiyadan asılı deyil, Kotlin kompilyator plugin-i vasitəsilə kompilyasiya mərhələsində serializatorlar yaradır.
Android Intent və Bundle üçün iki serializasiya mexanizmini dəstəkləyir. Serializable — refleksiyadan istifadə edən standart Java mexanizmidir, bu da aşağı performansa səbəb olur. Parcelable — Android-ə xas protokoldur, writeToParcel və createFromParcel metodlarının əl ilə tətbiqini tələb edir, lakin baytlarla birbaşa manipulyasiya sayəsində onlarla dəfə daha sürətli işləyir.
// Android-də Parcelable
@Parcelize
data class UserParcel(
val id: Int,
val name: String,
val email: String
) : Parcelable
// Intent vasitəsilə ötürülmə
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", userParcel)
startActivity(intent)
iOS-da kontrollerlər arasında məlumat ötürmək üçün Codable əvvəlcə Data-ya serializasiya ilə, proseslərarası ünsiyyət üçün isə NSKeyedArchiver istifadə olunur ki, o da obyektləri Property List ikili formatına çevirir. SwiftUI-də müasir layihələr tətbiq modulları arasında ötürmək üçün məlumatları JSONEncoder vasitəsilə kodlaşdırmağa üstünlük verir.
Etibarsız məlumatların səhv deserializasiyası zəifliklərə səbəb ola bilər. Serializasiya vasitəsilə hücumlar Java-da readObject metodunun dəyişdirilməsindən və ya üçüncü tərəf kitabxanaların təhlükəsiz deserializatorlarından istifadə edir. Android-də etibarsız mənbələrdən alınan məlumatlar üçün Serializable-dan qaçınmaq, bunun əvəzində Parcelable və ya deserializasiyadan sonra bütün sahələrin əl ilə doğrulanması tövsiyə olunur. iOS-da JSONDecoder standart olaraq tiplərə qarşı ciddidir, lakin JSONSerialization ilə işlərkən tərtibatçı şərti çevirmə vasitƏsilƏ tipləri yoxlamalıdır.
Serializasiya formatını seçərkən performans tələbləri, məlumat ölçüsü və uyğumluq nəzərə alınır. REST API və mikroxidmət arxitekturası üçün optimal seçim JSON olaraq qalır — o, bütün platformalar və dillər tərəfindən dəstəklənir. Yüksək yüklü sistemlər və məhdud trafikli mobil tətbiqlər üçün Protocol Buffers üstünlük təşkil edir ki, onlar daha kiçik ölçü və daha sürətli deserializasiya təmin edir. XML yalnız konfiqurasiya ssenarilərində və köhnə sistemlərlə inteqrasiyada əsaslandırılır. Müasir layihələrdə FlatBuffers da populyarlaşır — deserializasiya mərhələsi olmayan ikili format, oyun məhrəziklərində və minimal gecikməli tətbiqlərdə istifadə olunur. Hər formatın öz yeri var və düzgün seçim birbaşa tətbiqin iş sürətinə və istehlak olunan trafikin həcminə təsir edir.
Tez-tez verilən suallar
Serializasiya — bu tətbiq obyektinin şəbəkə üzərində göndərilə bilən və ya faylda saxlanıla bilən formata yığılmasıdır. Təsəvvür edin ki, bir əşyənin şəklini çəkirsiniz — şəkil serializasiyadır, əşyənin şəkildən bərpası isə deserializasiyadır.
JSON — insan tərəfindən oxuna bilən və sxem tələb etməyən mətn formatıdır. Protocol Buffers — məcburi sxemi (.proto) olan ikili formatdır, əhəmiyyətli dərəcədə kiçik ölçüdə və daha yüksək sürətdədir. Protobuf yüksək yüklü sistemlər üçün seçilir, JSON — universal uyğumluq üçün.
XML konfiqurasiya faylları (AndroidManifest, layout resursları), mürəkkəb iç-içə sənədlər və XSD vasitəsilə ciddi doğrulaması olan sistemlər üçün standart olaraq qalır. XML həmçinin SOAP protokollarında və ad fəzalarının dəstəyinin tələb olunduğu köhnə sistemlərdə tətbiq olunur.
Codable — avtomatik serializasiya və deserializasiya üçün Encodable və Decodable-ı birləşdirən Swift protokoludur. Kompilyator struktur və ya sinfin bütün xassələri üçün encode(to:) və init(from:) metodlarının tətbiqini yaradır.
Parcelable Serializable-dan əhəmiyyətli dərəcədə daha sürətli işləyir, çünki refleksiyadan istifadə etmir və sahələri birbaşa bayt axınına yazır. Müasir cihazlarda fərq Parcelable lehinə 10 dəfəyə qədər sürətlənməyə çata bilər.
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