A szerializáció egy objektum vagy adatszerkezet átalakításának folyamata olyan szekvenciális formátumba, amely alkalmas hálózaton keresztüli továbbításra vagy fájlba mentésre. A fordított folyamat, a deszerializáció, visszaállítja az adatokat az eredeti állapotba. A MDN Web Docs szerint a szerializáció minden folyamatok közötti kommunikációhoz szükséges. A Szerializáció a REST API, a gyorsítótárazás és az alkalmazáskomponensek közötti adatcsere alapját képezi.
Főbb pontok
Szerializáció az operatív memóriában lévő objektum lineáris bájt- vagy karaktersorozattá alakításának folyamata, amely hálózaton keresztül továbbítható, fájlba menthető vagy másik folyamatnak átadható. Szerializáció nélkül a hálózati kommunikáció, az állapottárolás és a folyamatok közötti kommunikáció nem lehetséges.
A szerializáció két ellentétes folyamatot foglal magában. A közvetlen folyamat (szerializáció) csomagolja az adatokat továbbításra alkalmas formátumba. A fordított folyamat (deszerializáció) visszaállítja az adatokat objektummá. A deszerializáció kritikus a biztonság szempontjából: a helytelen bemeneti adatok sebezhetőségekhez vezethetnek az alkalmazásban.
A mobilalkalmazások fejlesztésében a szerializáció mindenhol használatos: kérések küldése a szerverre és válaszok feldolgozása, az alkalmazás állapotának mentése képernyőelforgatáskor, adatok gyorsítótárazása a lemezen és adatok továbbítása a képernyők között Intent (Android) vagy Segue (iOS) segítségével.
Szerializációs formátumok szöveges és bináris formátumokra oszthatók. A szöveges formátumok (JSON, XML) ember által olvashatók és nem igényelnek eszközöket a megtekintéshez. A bináris formátumok (Protobuf, FlatBuffers, MessagePack) tömörebbek és gyorsabbak, de deszerializáció nélkül nem olvashatók. A formátumválasztás kompromisszum a teljesítmény és a hibakeresés kényelme között.
A JSON, XML és Protobuf mellett speciális formátumok is léteznek: FlatBuffers a Google-tól játékokhoz és AR-hoz, MessagePack — a JSON tömör bináris alternatívája, Avro az Apache-tól nagy adatokhoz a Kafka-ban, YAML — konfigurációs formátum megjegyzések támogatásával.
| Formátum | Típus | Séma | Méret | Sebesség |
|---|---|---|---|---|
| JSON | Szöveges | Opcionális | Közepes | Közepes |
| XML | Szöveges | XSD | Nagy | Alacsony |
| Protobuf | Bináris | Kötelező | Kicsi | Magas |
| FlatBuffers | Bináris | Kötelező | Kicsi | Maximális |
| MessagePack | Bináris | Nem | Kicsi | Magas |
| Avro | Bináris | JSON Schema | Kicsi | Magas |
Szerializáció a mobil platformokon sajátos jellemzőkkel bír: korlátozott forgalom, gyengébb processzorok és az állapot mentésének szükségessége képernyőelforgatáskor. Androidon Gson, Moshi, Kotlinx Serialization használatos. iOS-en — Codable, JSONSerialization, PropertyListEncoder. A könyvtár helyes megválasztása kritikusan befolyásolja az alkalmazás teljesítményét.
A Kotlinx Serialization — egy modern könyvtár a JetBrains-től Kotlin Multiplatform Mobile-hoz. Támogatja a JSON, Protobuf, CBOR és egyéni formátumokat. A kódgenerálás a fordítási szakaszban történik a Kotlin Serialization plugin segítségével, ami magas teljesítményt biztosít reflexió nélkül.
A Kotlinx Serialization könyvtár a @Serializable annotációt használja osztályokhoz és egy fordítóplugint a szerializátorok generálásához. Ez magas teljesítményt és típusbiztonságot biztosít. Az alapértelmezett formátum a JSON, de más formátumok is támogatottak további modulokon keresztül.
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)
// Szerializáció
val jsonString = json.encodeToString(project)
// Deszerializáció
val restored = json.decodeFromString<Project>(jsonString)
}
A Codable protokoll — a beépített szerializációs mechanizmus Swift-ben. Egyesíti az Encodable (szerializáció) és Decodable (deszerializáció) protokollokat. A JSONEncoder és JSONDecoder automatikusan feldolgozza a beágyazott struktúrákat, tömböket, opcionális értékeket és egyéni kulcsokat a CodingKeys segítségével.
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)
Teljesítmény a szerializációs formátumokat három mérőszám alapján értékelik: üzenetméret, szerializációs sebesség és deszerializációs sebesség. Mobilalkalmazások esetében mindhárom kritikus: a méret befolyásolja a forgalmat és a betöltési időt, a sebesség — a felület reagálóképességét és az alkalmazás indítási idejét.
A Protobuf és a FlatBuffers mutatják a legjobb eredményeket a bináris reprezentációnak köszönhetően. A FlatBuffers abban különbözik, hogy nem igényel külön deszerializációs lépést — az adatok közvetlenül a bináris pufferből olvashatók, ami ideális a minimális késleltetést igénylő játékokhoz és AR alkalmazásokhoz. A JSON továbbra is a legnépszerűbb formátum a REST API-hoz, az alacsonyabb teljesítmény ellenére, az egyszerűség és univerzalitás miatt.
| Forgatókönyv | Ajánlott formátum | Ok |
|---|---|---|
| REST API | JSON | Univerzalitás, olvashatóság, támogatás |
| Mikroszolgáltatások | Protobuf | Tömörség, sebesség, gRPC |
| Játékok / AR | FlatBuffers | Zero-copy, minimális késleltetés |
| Big Data | Avro | Kompatibilitás Kafka-val és Hadoop-dal |
| Konfiguráció | YAML | Megjegyzések, olvashatóság |
| Android layouts | XML | Platform szabvány |
Gyakorlati tesztek 1000 felhasználói objektum halmazán azt mutatják: Protobuf 12 KB méretű üzeneteket hoz létre (JSON — 85 KB, XML — 120 KB). Szerializációs idő: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Ezek a számok a bináris formátumokat teszik előnyössé a nagy terhelésű rendszerek és korlátozott forgalmú mobilalkalmazások számára.
Példák bemutatják ugyanazon objektum szerializációját különböző formátumokban. Ez segít vizuálisan összehasonlítani a méretet és az olvashatóságot. Ugyanaz a User objektum lesz szerializálva JSON, XML és Protobuf formátumban — jól látható, hogy a JSON tömörebb, mint az XML, a Protobuf pedig a legtömörebb és egyben olvashatatlan.
JSON — minimalista szintaxis, kulcsok idézőjelek között, különböző típusú értékek. 80 karaktert foglal. Olvashatóság magas, vizuális struktúra tiszta. Alkalmas API-hoz, ahol a fejlesztési és hibakeresési sebesség fontos.
XML — minden elem nyitó- és zárócímkébe van csomagolva. 150 karaktert foglal. Olvashatóság közepes, struktúra szigorú. Alkalmas dokumentumáramláshoz és XSD-n keresztüli érvényesítést igénylő rendszerekhez.
Protobuf — bináris, 32 bájt ezekhez az adatokhoz. Olvashatatlan — megtekintéséhez deszerializáció szükséges. Minimális mérete ideálissá teszi nagy terhelésű rendszerekhez és mobilalkalmazásokhoz.
{
"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>
Legjobb gyakorlatok segítenek elkerülni a tipikus hibákat és kiválasztani a megfelelő szerializációs stratégiát a projekthez. Ezen ajánlások betartása javítja a teljesítményt, biztonságot és a kód karbantarthatóságát.
Szerializáció biztonsága — kritikusan fontos szempont, különösen a megbízhatatlan forrásokból származó adatok deszerializációja esetén. A deszerializációs támadások távoli kódvégrehajtáshoz (RCE) vezethetnek, ami az egyik legveszélyesebb sebezhetőség a webes és mobil alkalmazásokban. A leghíresebb esetek a Java Serializable és a Python pickle kapcsán ismertek.
A Protobuf és a JSON beépített védelmet nyújt az ilyen támadások ellen, mivel csak adatokkal dolgoznak, nem tetszőleges objektumokkal. A Java Serializable ezzel szemben képes visszaállítani bármely, a classpath-ben elérhető osztályt, ami veszélyessé teszi a külső forrásokból érkező adatok fogadására. Androidon ajánlott a Kotlinx Serialization vagy Moshi használata a szabványos Java Serialization helyett.
További biztonsági intézkedések: állítson be korlátot a bemeneti adatok méretére, érvényesítse a sémát deszerializáció előtt, ne bízzon a HTTP-fejlécek Content-Type mezőjében, használjon engedélyezési listát (allowlist) a megengedett osztályokhoz. Rendszeresen frissítse a szerializációs könyvtárakat, mivel a bennük lévő sebezhetőségeket időszakosan felfedezik és kijavítják.
Gyakran Ismételt Kérdések
Szerializáció egy objektumot bájtsorozattá alakít, a marshalling adatokat továbbít különböző címtartományok között a típusok és struktúra megőrzésével. A marshalling magában foglalja a szerializációt a folyamat részeként, de tartalmazhat hivatkozások kódolását és memóriakezelést is.
A Google FlatBuffers biztosítja a maximális sebességet a zero-copy deszerializációnak köszönhetően — az adatok közvetlenül a bináris pufferből olvashatók átalakítás nélkül. A Protobuf a második, a JSON a harmadik helyen áll. Az XML a leggyakoribb formátumok közül a leglassabb.
Kotlinx Serialization — a legjobb választás új Kotlin projektekhez: fordító általi generálás, Kotlin Multiplatform támogatás, null safety. A Moshi jó választás Java projektekhez, teljesítménye jobb, mint a Gson-é. A Gson a legegyszerűbb könyvtár kezdéshez, de lassabb és reflexiót használ.
A ciklikus hivatkozások végtelen rekurzióhoz vezetnek szerializációkor. Megoldások: használjon ID hivatkozásokat a közvetlen objektumhivatkozások helyett, alkalmazzon speciális szerializációs adaptereket (pl. @JsonIgnore a Jacksonban), vagy tervezze újra az adatmodellt a ciklusok megszüntetésére.
Igen, különösen a megbízhatatlan forrásból származó adatok deszerializációja. A deszerializációs sebezhetőségek távoli kódvégrehajtáshoz vezethetnek. Javaslatok: ne deszerializáljon adatokat megbízhatatlan forrásokból, használjon osztály-allowlistet deszerializációkor és érvényesítse az adatsémát feldolgozás előtt.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is