Serileştirmeyi Çözme: nedir, veri kurtarma süreci

Yazar: IT Sectr Yayınlanma: 2026-03-08 Okuma süresi: 9 dk

Serileştirmeyi çözme, bir JSON, XML veya Protobuf veri akışından bir nesneyi geri yükleme işlemidir ve uzak bir API ile çalışan herhangi bir mobil uygulama için gereklidir. Apple Developer (2026)'a göre, gelen verilerin yanlış işlenmesi cihazlarda çökmelerin yaygın nedenlerinden biri olmaya devam etmektedir. iOS'ta JSONDecoder ve Android'de Gson standart araçlardır, ancak her birinin kendine özgü özellikleri ve sınırlamaları vardır.

Önemli Noktalar

  • Serileştirmeyi çözme, kodda kullanım için JSON, XML veya Protobuf'tan türü belirtilmiş bir nesnenin geri yüklenmesidir.
  • Codable, kod oluşturma desteği ile Swift'te otomatik serileştirmeyi çözme için Apple protokolüdür.
  • Moshi, farklı senaryolar için codegen ve reflection seçenekleri sunan Square'in Android kütüphanesidir.
  • Type mismatch, JSON alan türleri ile model özellikleri eşleşmediğinde en yaygın hatadır.
  • kotlinx.serialization, derleyici tarafından güvenli kod oluşturma ile JetBrains'in resmi çözümüdür.

Serileştirmeyi çözme nedir?

Serileştirmeyi çözme, bir bayt akışını veya yapılandırılmış metni bir programlama dili nesnesine dönüştürme işlemidir. Mobil geliştirmede, bu işlem bir uygulama sunucudan yanıt aldığında her seferinde gerçekleşir: bir JSON dizesi User, Order veya Product sınıfının bir örneğine dönüşür. Kullanıcıya veri gösteren ekranların kararlılığı doğrudan serileştirmeyi çözmenin doğruluğuna bağlıdır.

Serileştirmeden farkı

Serileştirme ve serileştirmeyi çözme karşılıklı olarak ters işlemlerdir ve pratikte nadiren simetriktir. Serileştirme, sunucuya göndermek için bir nesneyi dizeye dönüştürürken, serileştirmeyi çözme alınan dizeden nesneyi geri yükler. Sunucu, istemci modelinde olmayan bir alan gönderebilir, farklı bir tarih biçimi kullanabilir veya bir sayı yerine null döndürebilir. Square Engineering (2025)'e göre, biçim asimetrisi Android uygulamalarındaki ağ katmanı hatalarının %23'üne neden olur. Riski azaltmak için OpenAPI aracılığıyla şema sürümlemesi ve katı sözleşme belirtimi kullanılır.

Serileştirmeyi çözme için veri biçimleri

JSON, insan tarafından okunabilirliği ve yerleşik desteği sayesinde mobil API'ler için en popüler biçim olmaya devam etmektedir. Google'ın Protobuf'u yüksek yüklü sistemlerde kullanılır — JSON'dan 3-6 kat daha kompakttır ve daha hızlı ayrıştırılır, ancak .proto dosyalarından kod oluşturulmasını gerektirir ve araçlar olmadan okunamaz. XML, modern mobil uygulamalarda daha az yaygındır, ancak kurumsal sistemlerin SOAP hizmetlerinde ve Android yapılandırma dosyalarında kullanılır. MessagePack, yapı olarak JSON'a benzeyen ancak daha kompakt olan ikili bir biçimdir ve gerçek zamanlı sistemlerde popülerdir.

Serileştirmeyi çözme nasıl çalışır

Serileştirmeyi çözme süreci üç aşamadan geçer. İlk olarak, tokenizasyon ham metni anahtarlar, dizeler, sayılar ve ayırıcılar gibi tokenlara böler. Ardından, sözdizimsel analiz yapının doğruluğunu kontrol eder — parantezlerin kapalı olup olmadığı, tırnak işareti türünün doğru olup olmadığı, biçimin RFC 8259'a uygun olup olmadığı. Son aşama, uygulamanın nesne modeline eşlemedir ve burada her JSON anahtarına adlandırma stratejisi dikkate alınarak bir sınıf özelliği atanır.

Reflection vs Code generation

Mobil geliştirmede eşleme için iki yaklaşım ortaya çıkmıştır. Reflection (Gson, JSONSerialization), Java Reflection API veya Objective-C çalışma zamanı aracılığıyla çalışma zamanında sınıf yapısını analiz eder — esnektir ve ek yapılandırma gerektirmez, ancak daha yavaştır ve daha fazla bellek tüketir. Code generation (Moshi codegen, kotlinx.serialization, Codable) derleme zamanında kod oluşturur: daha hızlı, tür açısından daha güvenlidir ve reflection yoluyla iç yapıyı ifşa etmez. JetBrains ve Square, üretim derlemeleri için kod oluşturmayı önerir — Google kıyaslamalarında performans kazanımları 2-4 kata ulaşı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'te JSON'u User modeline dönüştürme örneği. convertFromSnakeCase stratejisi, snake_case API anahtarlarını otomatik olarak camelCase model özelliklerine dönüştürür — iOS projelerinde standart bir uygulamadır. data parametresi, URLSession aracılığıyla alınan sunucu yanıtının ham baytlarıdır. try ile hata yönetimi, uygulamayı çökertmeden hatalı JSON'u yakalamaya olanak tanır.

Kod çözme stratejilerinin rolü

JSONDecoder dört anahtar stratejisini destekler: useDefaultKeys (tam eşleşme), convertFromSnakeCase (snake_case → camelCase), custom (closure) ve convertFromKebabCase (kebab-case → camelCase). Tarihler için .iso8601, .secondsSince1970, .millisecondsSince1970 ve özel dateFormatter mevcuttur. Doğru stratejiyi seçmek, sağlam bir serileştirmeyi çözme için ilk adımdır ve çoğu biçim uyuşmazlığı hatasını önler.

iOS'ta serileştirmeyi çözme

JSONDecoder, iOS SDK'daki standart serileştirmeyi çözme mekanizmasıdır ve Codable protokolü ile çalışır. JSONDecoder, JSON'u otomatik olarak struct veya class örneklerine ayrıştırır, iç içe nesneleri, dizileri ve ilkel türleri destekler. Özel mantık için init(from: Decoder) yöntemi kullanılır — standart olmayan biçimleri işlemeye, eski bir API sürümünde eksik alanları ele almaya veya birden çok JSON anahtarını tek bir özellikte birleştirmeye olanak tanır.

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'ın tarih dizelerini nasıl yorumlayacağını belirler. .iso8601 en yaygın kullanılanıdır — standart REST API biçimi. İç içe enum OrderStatus, JSON dize değerlerinden otomatik olarak çözülür. Bu, sihirli sayıları önler ve kodu kendi kendini belgeleyen hale getirir — sipariş durumu her zaman kesin olarak tanımlanmış bir değer kümesine sahiptir.

Codable'da Property Wrappers

Swift 4.2'den itibaren Codable, tek tek özelliklerin özel serileştirmeyi çözmesi için property wrappers'ı destekler. @DefaultValue, JSON'da alan eksik olduğunda varsayılan bir değer ayarlayan popüler bir wrapper'dır. @LosslessString, bir diziyi sayıya ve tersine dönüştürür. Bu, özellikle sunucu bir kimliği "123" dizisi olarak gönderdiğinde ancak model bir Int beklediğinde kullanışlıdır. Property wrappers, init(from:) içindeki standart kod miktarını azaltır ve modelleri daha temiz hale getirir.

Android'te serileştirmeyi çözme

Android'te, serileştirmeyi çözme kütüphanesinin seçimi dile ve proje gereksinimlerine bağlıdır. Google'ın Gson'u, reflection aracılığıyla çalışan ancak karmaşık hiyerarşilerde performans sorunları olan en yaygın seçenektir. Square'in Moshi'si hem reflection hem de code generation'ı destekler, daha az bellek tüketir ve büyük yanıtları daha hızlı işler. JetBrains'in kotlinx.serialization'ı, derleyici entegrasyonuna sahip ve reflection kullanmayan yerel bir Kotlin çözümüdür.

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, sınıf için kod oluşturmayı etkinleştiren bir Kotlin derleyici ek açıklamasıdır. ignoreUnknownKeys parametresi, sunucu modelde eksik bir alan gönderirse çökmeleri önler. snake_case anahtarlarını eşlemek için @SerialName kullanılır — iOS'taki convertFromSnakeCase'in eşdeğeri. JetBrains (2026)'a göre kütüphane çoklu platformu destekler: aynı Serializable sınıfı Android, iOS (KMP) ve sunucu tarafı Kotlin'de çalışır.

Gson, Moshi ve kotlinx.serialization karşılaştırması

Kütüphaneler arasındaki seçim, hız-esneklik ödünleşimine dayanır. Gson, prototipler ve Java projeleri için iyidir — ek açıklama gerektirmez ve kutudan çıkar çıkmaz çalışır. Moshi orta konumdadır: @JsonClass(generateAdapter = true) aracılığıyla codegen, kotlinx.serialization'a yakın hız sağlarken, reflection modu Gson'un esnekliğini sunar. kotlinx.serialization, saf Kotlin projeleri için en hızlı seçenektir ancak Kotlin 1.4+ ve Gradle'da Kotlin Serialization eklentisi gerektirir.

KütüphaneMekanizmaHızKMP
GsonReflectionDüşükHayır
MoshiReflection / CodegenOrta / YüksekHayır
kotlinx.serializationDerleyici codegenYüksekEvet

Tipik hatalar ve önlenmesi

Type mismatch, JSON'un bir türde bir değer içermesi ancak modelin başka bir tür beklemesi durumudur. Sunucu, sayı yerine "42" dizesini veya boolean true yerine 1 sayısını göndermiştir. iOS'ta JSONDecoder varsayılan olarak DecodingError.typeMismatch fırlatır; Android'te Gson dönüştürmeyi denerken, Moshi ve kotlinx.serialization açık adaptörler gerektirir. Çözüm, belirli alanlar için lenient stratejileri veya özel serileştirmeyi çözücüler kullanmaktır.

Eksik alanlar ve nullable

Sunucu isteğe bağlı bir alanı içermediğinde, kod bir hatayla çöker. Swift'teki Optional alanlar ve Kotlin'deki nullable türler sorunu çözer: alan null ise veya JSON'da yoksa, özellik nil/null alır ve uygulama çalışmaya devam eder. Zorunlu alanlar için, serileştirmeyi çözmeden önce API istemci düzeyinde varlıklarını kontrol etmekte fayda vardır. Moshi ve kotlinx.serialization varsayılan olarak tüm alanları gerektirir — nullable işaretleme ve varsayılan değerler bu kısıtlamayı kaldırır.

API sürümü uyumsuzluğu

Sunucudaki JSON yapısındaki değişiklikler, üretim çökmelerinin yaygın bir kaynağıdır. Standart uygulama, kök nesnede bir version alanı aracılığıyla şema sürümlemesi ve istemcide 2-3 önceki sürümü desteklemektir. kotlinx.serialization, farklı sürümler için birden çok model bildirmeye ve JsonElement'e ilk ayrıştırmadan sonra version alanına göre doğru olanı seçmeye olanak tanır. Ek koruma, yeni alanlar için ignoreUnknownKeys ve kaldırılabilecek alanlar için varsayılan değerleri içerir.

HataBelirtiKorumalı kütüphane
Type mismatchDecodingError / İstisnakotlinx — coerceInputValues = true
Eksik alanErişimde çökmeMoshi — @Transient + default
Yanlış tarih biçimiKod çözme hatasıJSONDecoder — dateDecodingStrategy
Fazladan alanlarYok sayılır veya çökmekotlinx — ignoreUnknownKeys = true
Null olmayan alanda NullÇalışma zamanı çökmesiMoshi — @Nullable ile lenient

Serileştirmeyi çözme hatalarını günlüğe kaydetme, üretimde zorunlu bir uygulamadır. decode'u do/catch ile sarın, ham JSON'u ve beklenen model türünü Crashlytics veya Sentry'ye kaydedin. Bu, hangi API'nin hangi alanının hangi uygulama sürümünde bozulduğunu hızlı bir şekilde belirlemeyi sağlar. Günlüğe kaydetme olmadan, bir serileştirmeyi çözme hatası bağlamı olmayan gizemli bir çökme gibi görünür.

Sıkça Sorulan Sorular

Serileştirmeyi çözme, ayrıştırmadan (parsing) nasıl farklıdır?

Ayrıştırma, türü belirtilmiş bir model oluşturmadan yapılandırılmış metni bileşen öğelerine ayırmaktır. Serileştirmeyi çözme, sonucu bilinen özellik türlerine sahip tam teşekküllü bir dil nesnesi olan ayrıştırmanın belirli bir durumudur. Ayrıştırma akış tabanlı olabilir, serileştirmeyi çözme her zaman tam bir nesne oluşturur.

Yeni bir Android projesi için hangi serileştirmeyi çözme kütüphanesi seçilmelidir?

Saf Kotlin projesi için kotlinx.serialization önerilir — derleyiciye entegredir, reflection kullanmaz ve Kotlin Multiplatform'u destekler. Mevcut bir Java projesi için — code generation ile Moshi. Gson, değiştirilmesi önemli çaba gerektirecek eski projeler için bırakılmalıdır.

Sunucu snake_case gönderiyor ancak model camelCase kullanıyorsa ne yapmalı?

iOS'ta, JSONDecoder'da keyDecodingStrategy = .convertFromSnakeCase kullanın. Android'te kotlinx.serialization ile her alan için @SerialName kullanın. Moshi'de @Json(name="field_name") veya genel bir JsonAdapter.Factory uygulayın. Proje düzeyinde tutarlı bir stil, API sözleşmesinde kararlaştırılan en iyi uygulamadır.

Serileştirmeyi çözme neden geliştirmede değil de üretimde çöküyor?

En yaygın neden, zorunlu olarak bildirilen bir alanda sunucudan gelen beklenmeyen null'dır. Geliştirmede sunucu tam veri döndürür; üretimde kısaltılmış bir yanıt döndürür. Çözüm: potansiyel olarak eksik tüm alanları Kotlin'de nullable veya Swift'te optional olarak işaretleyin, ignoreUnknownKeys ve varsayılan değerleri kullanın.

Serileştirmeyi çözmede hangisi daha hızlıdır — Reflection mu Code generation mı?

Code generation (Moshi codegen, kotlinx.serialization, Codable), Google kıyaslamalarında reflection'dan 2-4 kat daha hızlıdır. Hızın yanı sıra, kod oluşturma tür açısından daha güvenlidir, çalışma zamanında sınıf meta verileri gerektirmez ve tür hataları, serileştirmeyi çözme sırasında değil derleme zamanında yakalanır.

Özet

  • Serileştirmeyi çözme, uygulama kodunda kullanım için JSON, XML veya Protobuf'tan bir nesneyi geri yükleyen temel bir mobil geliştirme sürecidir.
  • iOS, JSONDecoder'ı Codable protokolü ile kullanır ve anahtar ve tarih stratejileriyle JSON'dan modele otomatik dönüşüm sağlar.
  • Android üç araç sunar: Gson (reflection), Moshi (reflection/codegen) ve kotlinx.serialization (@Serializable ile derleyici oluşturma).
  • Yaygın hatalar — type mismatch, eksik alanlar, null olmayan alanlarda null ve API sürüm uyumsuzluğu — nullable türler, ignoreUnknownKeys ve sürümleme ile önlenir.
  • Code generation reflection'dan daha güvenli ve hızlıdır, bu nedenle mobil uygulamaların üretim derlemeleri için önerilir.
  • Eşleme stratejisi — iOS'ta keyDecodingStrategy ve Android'te @SerialName, sunucu ve istemci arasındaki adlandırma stili uyuşmazlığını çözer.
  • Üretim olaylarının hızlı teşhisi için serileştirmeyi çözme hatalarını Crashlytics veya Sentry'ye kaydettiğinizden emin olun.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun