Serializace je proces přeměny objektu nebo datové struktury na sekvenční formát vhodný pro přenos po síti nebo uložení do souboru. Opačný proces, deserializace, obnovuje data do původního stavu. Podle MDN Web Docs je serializace nezbytná pro jakoukoli komunikaci mezi procesy. Serializace je základem REST API, ukládání do mezipaměti a výměny dat mezi komponentami aplikace.
Hlavní body
Serializace je proces přeměny objektu v operační paměti na lineární sekvenci bajtů nebo znaků, kterou lze přenést po síti, uložit do souboru nebo předat jinému procesu. Bez serializace není možná síťová komunikace, ukládání stavu a komunikace mezi procesy.
Serializace zahrnuje dva protichůdné procesy. Přímý proces (serializace) balí data do formátu pro přenos. Opačný proces (deserializace) obnovuje data zpět do objektu. Deserializace je kritická pro bezpečnost: nesprávná vstupní data mohou vést k bezpečnostním chybám v aplikaci.
Vývoj mobilních aplikací používá serializaci všude: odesílání požadavků na server a zpracování odpovědí, ukládání stavu aplikace při otočení obrazovky, ukládání dat do mezipaměti na disku a přenos dat mezi obrazovkami přes Intent (Android) nebo Segue (iOS).
Formáty serializace se dělí na textové a binární. Textové formáty (JSON, XML) jsou čtelné pro člověka a nevyžadují nástroje pro prohlížení. Binární formáty (Protobuf, FlatBuffers, MessagePack) jsou kompaktnější a rychlejší, ale nečtelné bez deserializace. Výběr formátu je kompromis mezi výkonem a pohodlím při ladění.
Kromě JSON, XML a Protobuf existují specializované formáty: FlatBuffers od Google pro hry a AR, MessagePack — kompaktní binární alternativa JSON, Avro od Apache pro velká data v Kafce, YAML — konfigurační formát s podporou komentářů.
| Formát | Typ | Schéma | Velikost | Rychlost |
|---|---|---|---|---|
| JSON | Textový | Volitelné | Střední | Střední |
| XML | Textový | XSD | Velká | Nízká |
| Protobuf | Binární | Povinné | Malá | Vysoká |
| FlatBuffers | Binární | Povinné | Malá | Maximální |
| MessagePack | Binární | Ne | Malá | Vysoká |
| Avro | Binární | JSON Schema | Malá | Vysoká |
Serializace na mobilních platformách má svá specifika: omezený provoz, slabší procesory a nutnost ukládání stavu při otáčení obrazovky. Na Androidu se používají Gson, Moshi, Kotlinx Serialization. Na iOS — Codable, JSONSerialization, PropertyListEncoder. Správný výběr knihovny kriticky ovlivňuje výkon aplikace.
Kotlinx Serialization — moderní knihovna od JetBrains pro Kotlin Multiplatform Mobile. Podporuje JSON, Protobuf, CBOR a vlastní formáty. Generování kódu probíhá ve fázi kompilace pomocí pluginu Kotlin Serialization, což zajišťuje vysoký výkon bez použití reflexe.
Knihovna Kotlinx Serialization používá anotaci @Serializable pro třídy a kompilátorový plugin pro generování serializátorů. To zajišťuje vysoký výkon a typovou bezpečnost. Výchozí formát je JSON, ale ostatní formáty jsou také podporovány prostřednictvím dalších modulů.
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)
// Serializace
val jsonString = json.encodeToString(project)
// Deserializace
val restored = json.decodeFromString<Project>(jsonString)
}
Protokol Codable — vestavěný mechanismus serializace v Swift. Spojuje protokoly Encodable (serializace) a Decodable (deserializace). JSONEncoder a JSONDecoder automaticky zpracovávají vnořené struktury, pole, volitelné hodnoty a vlastní klíče pomocí CodingKeys.
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)
Výkon formátů serializace se hodnotí podle tří metrik: velikost zprávy, rychlost serializace a rychlost deserializace. Pro mobilní aplikace jsou všechny tři kritické: velikost ovlivňuje provoz a dobu načítání, rychlost — odezvu rozhraní a dobu spuštění aplikace.
Protobuf a FlatBuffers vykazují nejlepší výsledky díky binární reprezentaci. FlatBuffers se liší tím, že nevyžaduje samostatný krok deserializace — data se čtou přímo z binárního bufferu, což je ideální pro hry a AR aplikace s požadavkem na minimální latenci. JSON zůstává nejpopulárnějším formátem pro REST API, navzdory nižšímu výkonu, díky jednoduchosti a univerzálnosti.
| Scénář | Doporučený formát | Důvod |
|---|---|---|
| REST API | JSON | Univerzálnost, čitelnost, podpora |
| Mikroslužby | Protobuf | Kompaktnost, rychlost, gRPC |
| Hry / AR | FlatBuffers | Zero-copy, minimální latence |
| Big Data | Avro | Kompatibilita s Kafka a Hadoop |
| Konfigurace | YAML | Komentáře, čitelnost |
| Android layouts | XML | Standard platformy |
Praktické testy na sadě 1000 uživatelských objektů ukazují: Protobuf vytváří zprávy o velikosti 12 KB (JSON — 85 KB, XML — 120 KB). Doba serializace: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Tato čísla činí binární formáty preferovanými pro systémy s vysokou zátěží a mobilní aplikace s omezeným provozem.
Příklady demonstrují serializaci stejného objektu v různých formátech. Pomáhá to vizuálně porovnat velikost a čitelnost. Stejný objekt User bude serializován v JSON, XML a Protobuf — je jasně vidět, že JSON je kompaktnější než XML a Protobuf je nejkompaktnější a zároveň nečitelný.
JSON — minimalistická syntaxe, klíče v uvozovkách, hodnoty různých typů. Zabírá 80 znaků. Čitelnost vysoká, vizuální struktura přehledná. Vhodný pro API, kde je důležitá rychlost vývoje a ladění.
XML — každý prvek je zabalen do otevírací a uzavírací značky. Zabírá 150 znaků. Čitelnost střední, struktura přísná. Vhodný pro tok dokumentů a systémy vyžadující validaci pomocí XSD.
Protobuf — binární, 32 bajtů pro tato data. Nečitelný — vyžaduje deserializaci pro prohlížení. Minimální velikost ho činí ideálním pro systémy s vysokou zátěží a mobilní aplikace.
{
"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>
Nejlepší postupy pomáhají vyhnout se typickým chybám a vybrat správnou strategii serializace pro projekt. Dodržování těchto doporučení zlepšuje výkon, bezpečnost a udržovatelnost kódu.
Bezpečnost serializace — kriticky důležitý aspekt, zejména při deserializaci dat z nedůvěryhodných zdrojů. Útoky na deserializaci mohou vést k vzdálenému spuštění kódu (RCE), což je jedna z nejnebezpečnějších zranitelností ve webových a mobilních aplikacích. Nejznámější případy souvisí s Java Serializable a Python pickle.
Protobuf a JSON mají vestavěnou ochranu proti takovým útokům, protože pracují pouze s daty, nikoli s libovolnými objekty. Java Serializable naopak může obnovit jakoukoli třídu dostupnou v classpath, což ho činí nebezpečným pro příjem dat z externích zdrojů. Na Androidu se doporučuje používat Kotlinx Serialization nebo Moshi místo standardní Java Serialization.
Další bezpečnostní opatření: nastavte limit na velikost vstupních dat, validujte schéma před deserializací, nedůvěřujte Content-Type z HTTP hlaviček, použijte allowlist pro povolené třídy. Pravidelně aktualizujte knihovny serializace, protože zranitelnosti v nich jsou pravidelně objevovány a opravovány.
Často kladené otázky
Serializace převádí objekt na posloupnost bajtů, marshalling přenáší data mezi různými adresními prostory s uchováním typů a struktury. Marshalling zahrnuje serializaci jako součást procesu, ale může také zahrnovat kódování odkazů a správu paměti.
FlatBuffers od Google poskytuje maximální rychlost díky zero-copy deserializaci — data se čtou přímo z binárního bufferu bez převodu. Protobuf je na druhém místě, JSON na třetím. XML je nejpomalejší formát z běžných.
Kotlinx Serialization — nejlepší volba pro nové projekty v Kotlin: generování při kompilaci, podpora Kotlin Multiplatform, null safety. Moshi — dobrá volba pro projekty v Java, výkonnější než Gson. Gson — nejjednodušší knihovna pro začátek, ale pomalejší a používá reflexi.
Cykliké reference vedou k nekonečné rekurzi při serializaci. Řešení: použijte ID reference místo přímých odkazů na objekty, aplikujte speciální serializační adaptéry (např. @JsonIgnore v Jackson) nebo přepracujte datový model pro odstranění cyklů.
Ano, zejména deserializace dat z nedůvěryhodných zdrojů. Zranitelnosti deserializace mohou vést k vzdálenému spuštění kódu. Doporučení: nedeserializujte data z nedůvěryhodných zdrojů, použijte allowlist tříd při deserializaci a validujte schéma dat před zpracováním.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také