Deserializasiya: bu nədir, məlumatların bərpa prosesi

Müəllif: IT Sectr Dərc olunub: 2026-03-08 Oxuma vaxtı: 9 dəq

Deserializasiya — uzaq API ilə işləyən istənilən mobil tətbiq üçün zəruri olan JSON, XML və ya Protobuf məlumat axınından obyektin bərpa edilməsi prosesidir. Apple Developer (2026) məlumatlarına görə, daxil olan məlumatların səhv emalı cihazlardakı çökmələrin tez-tez rast gəlinən səbəblərindən biri olaraq qalır. iOS-da JSONDecoder və Android-də Gson standart alətlərdir, lakin hər birinin öz xüsusiyyətləri və məhdudiyyətləri var.

Əsas məqamlar

  • Deserializasiya — koddada istifadə üçün JSON, XML və ya Protobuf-dan tipləşdirilmiş obyektin bərpa edilməsi.
  • Codable — Swift-də kod generasiyası dəstəyi ilə avtomatik deserializasiya üçün Apple protokolu.
  • Moshi — müxtəlif ssenarilər üçün codegen və reflection seçimləri olan Square-dən Android kitabxanası.
  • Type mismatch — JSON sahələrinin tipləri ilə modelin xüsusiyyətlərinin uyğunsuzluğunda ən tez-tez rast gəlinən səhv.
  • kotlinx.serialization — təhlükəsiz kodun kompilyator generasiyası ilə JetBrains-in rəsmi həlli.

Deserializasiya nədir?

Deserializasiya — bayt axınının və ya strukturlaşdırılmış mətnin proqramlaşdırma dili obyektinə çevrilməsi prosesidir. Mobil inkişafda bu proses tətbiq serverdən cavab aldıqda hər dəfə baş verir: JSON sətri User, Order və ya Product sinifinin nümunəsinə çevrilir. Deserializasiyanın düzgünlüyü istifadəçiyə məlumat göstərən ekranların sabitliyinə birbaşa təsir edir.

Serializasiyadan fərqi

Serializasiya və deserializasiya — qarşılıqlı tərs proseslərdir, praktikada nadir hallarda simmetrik olur. Serializasiya obyekti serverə göndərmək üçün sətrə çevirir, deserializasiya isə alınan sətrdən obyekti bərpa edir. Server müştəri modelində olmayan sahə göndərə, başqa tarix formatından istifadə edə və ya rəqəm əvəzinə null qaytara bilər. Square Engineering (2025) məlumatlarına görə, format asimmetriyası Android tətbiqlərində şəbəkə qatı səhvlərinin 23%-nin səbəbidir. Riski azaltmaq üçün sxem versiyalaşdırma və OpenAPI vasitəsilə ciddi müqavilə spesifikasiyası tətbiq edilir.

Deserializasiya üçün məlumat formatları

JSON oxunaqlılığı və daxili dəstəyi sayəsində mobil API-lər üçün ən populyar format olaraq qalır. Google-dan Protobuf yüksək yüklü sistemlərdə istifadə olunur — JSON-dan 3-6 dəfə yığcam və daha sürətli pars edilir, lakin .proto fayllarından kod yaradılması tələb edir və alətsiz oxuna bilməz. XML müasir mobil tətbiqlərdə daha az rast gəlinir, lakin korporativ sistemlərin SOAP xidmətlərində və Android konfiqurasiya fayllarında tətbiq olunur. MessagePack — quruluşuna görə JSON-a bənzəyən, lakin daha yığcam olan ikili format, real vaxt sistemlərində məşhurdur.

Deserializasiya necə işləyir

Deserializasiya prosesi üç mərhələdən keçir. Əvvəlcə tokenizasiya xam mətni leksemlərə ayırır: açarlar, sətrlər, rəqəmlər və ayırıcılar. Sonra sintaktik analiz quruluşun düzgünlüyünü yoxlayır — mötərizələrin bağlı olub-olmaması, dırnaq işərəsinin növünün düzgünlüyü, formatın RFC 8259 spesifikasiyasına uyğunluğu. Son mərhələ mapinq — tətbiqin obyekt modelinə, burada hər JSON açarına adlandırma strategiyası nəzərə alınmaqla sinifin xüsusiyyəti təyin edilir.

Reflection vs Code generation

Mobil inkişafda mapinq üçün iki yanaşma formalaşıb. Reflection (Gson, JSONSerialization) sinifin strukturunu Java Reflection API və ya Objective-C runtime vasitəsilə iş vaxtı təhlil edir — bu çevikdir və əlavə konfiqurasiya tələb etmir, lakin daha yavaşdır və daha çox yaddaş sərf edir. Code generation (Moshi codegen, kotlinx.serialization, Codable) kompilyasiya mərhələsində kod yaradır: daha sürətli, tiplər baxımından daha təhlükəsiz və reflection vasitəsilə daxili quruluşu açıqlamır. JetBrains və Square istehsal qurğuları üçün code generation tövsiyə edir — Google benchmarklarında performans artışı 2-4 dəfəyə çatır.

swift
struct User: Codable {
    let id: Int
    let name: String
    let email: String
    let createdAt: Date
}

let json = """
{
    "id": 42,
    "name": "Alice",
    "email": "alice@example.com",
    "created_at": "2026-06-01T12:00:00Z"
}
"""
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let user = try decoder.decode(User.self, from: data)

Swift-də User modelinə JSON deserializasiyası nümunəsi. convertFromSnakeCase strategiyası API-nin snake_case açarlarını avtomatik olaraq modelin camelCase xüsusiyyətlərinə çevirir — iOS layihələrində standart təcrübə. data parametri URLSession vasitƏlsilə alınan server cavabının xam baytlarıdır. try vasitəsilə səhv idarəetməsi tətbiqi çöküşə uğratmadan yanlış JSON tutmağa imkan verir.

Dekodlama strategiyalarının rolu

JSONDecoder dörd açar strategiyasını dəstəkləyir: useDefaultKeys (dəqiq uyğunluq), convertFromSnakeCase (snake_case → camelCase), custom (closure) və convertFromKebabCase (kebab-case → camelCase). Tarixlər üçün .iso8601, .secondsSince1970, .millisecondsSince1970 və xüsusi dateFormatter nəzərdə tutulub. Düzgün strategiyanın seçilməsi sabit deserializasiyaya doğru ilk addımdır və format uyğunsuzluğu səhvlərinin əksəriyyətinin qarşısını alır.

iOS-da deserializasiya

JSONDecoder — Codable protokolu ilə işləyən iOS SDK-da standart deserializasiya mexanizmidir. JSONDecoder avtomatik olaraq JSON-u struct və ya class nümunələrinə pars edir, iç-içə obyektləri, massivləri və primitiv tipləri dəstəkləyir. Xüsusi məntiq üçün init(from: Decoder) metodundan istifadə olunur — bu, qeyri-standart formatları, köhnə API versiyasında buraxılmış sahələri idarə etməyə və ya bir neçə JSON açarını bir xüsusiyyətdə birləşdirməyə imkan verir.

swift
struct Order: Decodable {
    let orderId: String
    let amount: Double
    let status: OrderStatus

    enum OrderStatus: String, Decodable {
        case pending, confirmed, shipped, cancelled
    }
}

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let order = try decoder.decode(Order.self, from: jsonData)

DateDecodingStrategy JSONDecoder-in tarixlər olan sətrləri necə şərh etdiyini müyənləşdirir. Ən çox .iso8601 istifadə olunur — REST API-ün standart formatı. İç-içə enum OrderStatus JSON sətr dəyərlərindən avtomatik dekodlanır. Bu, sehrli rəqəmlərdən qaçınmağa və kodu özünü sənədləşdirən etməyə imkan verir — sifariş statusu hər zaman ciddi müyən edilmiş dəyərlər toplusuna malikdir.

Codable-da Property Wrappers

Swift 4.2-dən etibarən, Codable ayrı-ayrı xüsusiyyətlərin xüsusi deserializasiyası üçün property wrappers dəstəkləyir. @DefaultValue — JSON-da sahə yoxdursa, standart dəyər təyin edən məşhur wrapper. @LosslessString sətri rəqəmə və əksinə çevirir. Bu, server id-ni sətr şəklində „123” göndərdikdə və model Int gözlədikdə xüsusilə faydalıdır. Property wrappers init(from:)-də şablon kodunu azaldır və modelləri təmizləyir.

Android-də deserializasiya

Android-də deserializasiya kitabxanasının seçimi layihənin dilindən və tələblərindən asılıdır. Google-dan Gson — reflection vasitəsilə işləyən ən geniş yayılmış variant, lakin mürəkkəb iyerarxiyalarda performans problemləri var. Square-dən Moshi həm reflection, həm də code generation dəstəkləyir, daha az yaddaş sərf edir və böyük cavabları daha sürətli emal edir. JetBrains-dən kotlinx.serialization — kompilyatora inteqrasiya olunmuş, heç reflection istifadə etməyən yerli Kotlin həllidir.

kotlin
@Serializable
data class User(
    @SerialName("user_id")
    val userId: Int,
    val name: String,
    val email: String,
    @SerialName("created_at")
    val createdAt: String
)

val json = Json { ignoreUnknownKeys = true }
val user = json.decodeFromString<User>(response)

@Serializable — sinif üçün kod generasiyasını aktivləşdirən Kotlin kompilyator annotasiyası. ignoreUnknownKeys parametri server modeldə olmayan sahə göndərdikdə çöküşün qarşısını alır. snake_case açarlarının mapinqi üçün @SerialName istifadə olunur — iOS-dakı convertFromSnakeCase-in analoqu. JetBrains (2026) məlumatlarına görə, kitabxana çoxplatformalılığı dəstəkləyir: eyni Serializable sinfi Android, iOS (KMP) və server Kotlin-də işləyir.

Gson, Moshi və kotlinx.serialization müqayisəsi

Kitabxanalar arasında seçim sürət-çeviklik kompromisinə gəlir. Gson prototiplər və Java layihələri üçün yaxşıdır — annotasiya tələb etmir və „hazır” işləyir. Moshi orta mövqe tutur: @JsonClass(generateAdapter = true) vasitəsilə codegen kotlinx.serialization-a yaxın sürət verir, reflection rejimi isə Gson-un çevikliyini təmin edir. kotlinx.serialization təmiz Kotlin layihələri üçün ən sürətli variantdır, lakin Kotlin 1.4+ və Gradle-də Kotlin Serialization plaginini tələb edir.

KitabxanaMexanizmSürətKMP
GsonReflectionAşağıXeyr
MoshiReflection / CodegenOrta / YüksəkXeyr
kotlinx.serializationCompiler codegenYüksəkBəli

Tipik səhvlər və onların qarşısının alınması

Type mismatch — JSON bir tipin dəyərini ehtiva etdikdə, model isə başqa tip gözlədikdə yaranan vəziyyət. Server rəqəm əvəzinə „42” sətrini və ya boolean true əvəzinə 1 rəqəmini göndərdi. iOS-da JSONDecoder standart olaraq DecodingError.typeMismatch atacaq, Android-də Gson çevirməyə çalışacaq, Moshi və kotlinx.serialization isə açıq adapterlər tələb edir. Həll — lenient strategiyalarından və ya konkret sahələr üçün xüsusi deserializatorlardan istifadə etmək.

Çatışmayan sahələr və nullable

Server isteğə bağlı sahəni daxil etmədikdə, kod səhvlə və çökür. Swift-də Optional və Kotlin-də nullable tiplər problemi həll edir: sahə null və ya JSON-da yoxdursa, xüsusiyyət nil/null dəyərini alır və tətbiq işləməyə davam edir. Məcburi sahələr üçün deserializasiyadan əvvəl API müştərisi səviyyəsində onların mövcudluğunu yoxlamağa dəyər. Moshi və kotlinx.serialization standart olaraq bütün sahələri tələb edir — nullable işaretləməsi və standart dəyərlər bu məhdudiyyəti aradan qaldırır.

API versiyalarının uyğunsuzluğu

Serverdə JSON strukturunun dəyişdirilməsi — istehsalatda çöküşlərin tez-tez rast gəlinən mənbəyidir. Standart təcrübə kök obyektdə version sahəsi vasitəsilə sxem versiyalaşdırma və müştəri tərəfində 2-3 əvvəlki versiyanın dəstəklənməsidir. kotlinx.serialization müxtəlif versiyalar üçün bir neçə model elan etməyə və JsonElement-ə ilkin parslamadan sonra version sahəsi əsasında uyğunu seçməyə imkan verir. Əlavə qoruma — yeni sahələr üçün ignoreUnknownKeys və silinə biləcək sahələr üçün standart dəyərlər.

SəhvSimptomQoruma ilə kitabxana
Type mismatchDecodingError / istisnakotlinx — coerceInputValues = true
Sahənin olmamasıMüraciətdə çöküşMoshi — @Transient + default
Yanlış tarix formatıDekodlama səhviJSONDecoder — dateDecodingStrategy
Əlavə sahələrNəzərdən qaçırılır və ya çöküşkotlinx — ignoreUnknownKeys = true
Non-null sahədə nullİş vaxtı çöküşüMoshi — lenient + @Nullable

Deserializasiya səhvlərinin qeydiyyatı — istehsalatda məcburi təcrübədir. decode-u do/catch ilə əhatə edin, xam JSON-u və gözlənilən modelin tipini Crashlytics və ya Sentry-də qeyd edin. Bu, hansı API-nin hansı sahəsinin və tətbiqin hansı versiyasında xarab olduğunu tez müyən etməyə imkan verir. Qeydiyyat olmadan deserializasiya səhvi kontekstsiz sirli çöküş kimi görünür.

Tez-tez verilən suallar

Deserializasiya parsingdən nə ilə fərqlənir?

Parsing — məcburi tipləşdirilmiş model yaratmadan strukturlaşdırılmış mətnin tərkib hissələrinə ayrılmasıdır. Deserializasiya parsingin xüsusi halıdır, nəticəsi məlum tip xüsusiyyətləri olan tamhüquqlu dil obyektidir. Parsing axınlı ola bilər, deserializasiya hər zaman tam obyekt yaradır.

Yeni Android layihəsi üçün hansı deserializasiya kitabxanasını seçməli?

Təmiz Kotlin layihəsi üçün kotlinx.serialization tövsiyə olunur — kompilyatora inteqrasiya olunub, reflection istifadə etmir və Kotlin Multiplatform dəstəkləyir. Mövcud Java layihəsi üçün — code generation ilə Moshi. Gson-u dəyişdirilməsi əhəmiyyətli əmək tələb edəcək legacy layihələr üçün buraxmaq daha yaxşıdır.

Server snake_case göndərir, model isə camelCase-dirsə nə etməli?

iOS-da JSONDecoder-də keyDecodingStrategy = .convertFromSnakeCase istifadə edin. Android-də kotlinx.serialization-da hər sahə üçün @SerialName istifadə edin. Moshi-də @Json(name=„field_name”) və ya qlobal JsonAdapter.Factory tətbiq edin. Layihə səviyyəsində vahid stil — API müqaviləsində razılaşdırılmış best practice-dir.

Nü üçün deserializasiya inkişafda yox, istehsalatda çöküşə səbəb olur?

Ən çox səbəb məcburi elan edilmiş sahədə serverdən gözlənməyən null-dur. İnkişafda server tam məlumat qaytarır, istehsalatda isə qısaldılmış cavab. Həll: potensial olmayan bütün sahələri nullable (Kotlin) və ya optional (Swift) olaraq işaretləyin, ignoreUnknownKeys və standart dəyərlərdən istifadə edin.

Deserializasiyada hansı daha sürətlidir — Reflection yoxsa Code generation?

Code generation (Moshi codegen, kotlinx.serialization, Codable) Google benchmarklarında reflection-dan 2-4 dəfə sürətli işləyir. Sürətdən əlavə, kod generasiyası tiplər baxımından daha təhlükəsizdir, iş vaxtı sinif metadatası tələb etmir və tip səhvləri deserializasiya anında deyil, kompilyasiya mərhələsində aşkarlanır.

Xülasə

  • Deserializasiya — tətbiq kodunda istifadə üçün JSON, XML və ya Protobuf-dan obyekti bərpa edən mobil inkişafın fundamental prosesidir.
  • iOS JSONDecoder-dən Codable protokolu ilə istifadə edir, açar və tarix strategiyaları ilə JSON-dan modelə avtomatik çevrilməni təmin edir.
  • Android üç alət təklif edir: Gson (reflection), Moshi (reflection/codegen) və kotlinx.serialization (@Serializable vasitəsilə kompilyator generasiyası).
  • Tipik səhvlər — type mismatch, çatışmayan sahələr, non-null sahələrdə null və API versiyalarının uyğunsuzluğu — nullable tiplər, ignoreUnknownKeys və versiyalaşdırma ilə qarşısı alınır.
  • Code generation reflection-dan daha təhlükəsiz və sürətlidir, buna görə mobil tətbiqlərin istehsal qurğuları üçün tövsiyə olunur.
  • Mapinq strategiyası — iOS-da keyDecodingStrategy və Android-də @SerialName server və müştəri arasında adlandırma stil uyğunsuzluğu problemini həll edir.
  • Deserializasiya səhvlərini istehsalat hadisələrinin sürətli diaqnostikası üçün Crashlytics və ya Sentry-də qeyd etmək məcburidir.

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.

Layihəni müzakirə et

Həm də oxuyun