Serialisatie is het proces van het omzetten van een object of gegevensstructuur naar een sequentieel formaat dat geschikt is voor verzending via een netwerk of opslag in een bestand. Het omgekeerde proces, deserialisatie, herstelt de gegevens in de oorspronkelijke staat. Volgens MDN Web Docs is serialisatie noodzakelijk voor elke communicatie tussen processen. Serialisatie vormt de basis van REST API, caching en gegevensuitwisseling tussen applicatiecomponenten.
Belangrijkste punten
Serialisatie is het proces van het omzetten van een object dat zich in het werkgeheugen bevindt naar een lineaire reeks bytes of tekens die via een netwerk kan worden verzonden, in een bestand kan worden opgeslagen of aan een ander proces kan worden doorgegeven. Zonder serialisatie is netwerkcommunicatie, statusopslag en communicatie tussen processen niet mogelijk.
Serialisatie omvat twee tegenovergestelde processen. Het directe proces (serialisatie) verpakt gegevens in een formaat voor verzending. Het omgekeerde proces (deserialisatie) herstelt gegevens terug naar een object. Deserialisatie is kritiek voor beveiliging: onjuiste invoergegevens kunnen leiden tot kwetsbaarheden in de applicatie.
Bij de ontwikkeling van mobiele applicaties wordt serialisatie overal gebruikt: het verzenden van verzoeken naar de server en het verwerken van antwoorden, het opslaan van de applicatiestatus bij schermrotatie, het cachen van gegevens op schijf en het verzenden van gegevens tussen schermen via Intent (Android) of Segue (iOS).
Serialisatieformaten worden onderverdeeld in tekst- en binaire formaten. Tekstformaten (JSON, XML) zijn leesbaar voor mensen en vereisen geen hulpmiddelen voor weergave. Binaire formaten (Protobuf, FlatBuffers, MessagePack) zijn compacter en sneller, maar niet leesbaar zonder deserialisatie. De formatkeuze is een compromis tussen prestaties en debug-gemak.
Naast JSON, XML en Protobuf zijn er gespecialiseerde formaten: FlatBuffers van Google voor games en AR, MessagePack — een compact binair alternatief voor JSON, Avro van Apache voor big data in Kafka, YAML — een configuratieformaat met ondersteuning voor opmerkingen.
| Formaat | Type | Schema | Grootte | Snelheid |
|---|---|---|---|---|
| JSON | Tekst | Optioneel | Gemiddeld | Gemiddeld |
| XML | Tekst | XSD | Groot | Laag |
| Protobuf | Binair | Verplicht | Klein | Hoog |
| FlatBuffers | Binair | Verplicht | Klein | Maximaal |
| MessagePack | Binair | Nee | Klein | Hoog |
| Avro | Binair | JSON Schema | Klein | Hoog |
Serialisatie op mobiele platforms heeft zijn eigen specificiteit: beperkt verkeer, zwakkere processors en de noodzaak om de status bij schermrotatie op te slaan. Op Android worden Gson, Moshi, Kotlinx Serialization gebruikt. Op iOS — Codable, JSONSerialization, PropertyListEncoder. De juiste keuze van de bibliotheek heeft een kritische invloed op de prestaties van de applicatie.
Kotlinx Serialization — een moderne bibliotheek van JetBrains voor Kotlin Multiplatform Mobile. Het ondersteunt JSON, Protobuf, CBOR en aangepaste formaten. Codegeneratie vindt plaats in de compilatiefase via de Kotlin Serialization-plug-in, wat hoge prestaties garandeert zonder gebruik van reflectie.
De bibliotheek Kotlinx Serialization gebruikt de @Serializable-annotatie voor klassen en een compiler-plug-in voor het genereren van serializers. Dit zorgt voor hoge prestaties en typeveiligheid. Het standaardformaat is JSON, maar andere formaten worden ook ondersteund via extra modules.
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)
// Serialisatie
val jsonString = json.encodeToString(project)
// Deserialisatie
val restored = json.decodeFromString<Project>(jsonString)
}
Het protocol Codable — het ingebouwde serialisatiemechanisme in Swift. Het combineert de protocollen Encodable (serialisatie) en Decodable (deserialisatie). JSONEncoder en JSONDecoder verwerken automatisch geneste structuren, arrays, optionele waarden en aangepaste sleutels via 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)
Prestaties van serialisatieformaten worden beoordeeld op drie metrieken: berichtgrootte, serialisatiesnelheid en deserialisatiesnelheid. Voor mobiele applicaties zijn alle drie kritisch: grootte beïnvloedt het verkeer en de laadtijd, snelheid — de responsiviteit van de interface en de opstarttijd van de applicatie.
Protobuf en FlatBuffers tonen de beste resultaten dankzij de binaire representatie. FlatBuffers onderscheidt zich doordat het geen aparte deserialisatiestap vereist — gegevens worden rechtstreeks uit de binaire buffer gelezen, wat ideaal is voor games en AR-applicaties met minimale latentie-eisen. JSON blijft het populairste formaat voor REST API, ondanks mindere prestaties, vanwege de eenvoud en universaliteit.
| Scenario | Aanbevolen formaat | Reden |
|---|---|---|
| REST API | JSON | Universaliteit, leesbaarheid, ondersteuning |
| Microservices | Protobuf | Compactheid, snelheid, gRPC |
| Games / AR | FlatBuffers | Zero-copy, minimale latentie |
| Big Data | Avro | Compatibiliteit met Kafka en Hadoop |
| Configuratie | YAML | Opmerkingen, leesbaarheid |
| Android layouts | XML | Platformstandaard |
Praktijktests op een set van 1000 gebruikersobjecten tonen aan: Protobuf creëert berichten van 12 KB (JSON — 85 KB, XML — 120 KB). Serialisatietijd: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Deze cijfers maken binaire formaten de voorkeur voor systemen met hoge belasting en mobiele applicaties met beperkt verkeer.
Voorbeelden tonen de serialisatie van hetzelfde object in verschillende formaten. Dit helpt om de grootte en leesbaarheid visueel te vergelijken. Hetzelfde User-object wordt geserialiseerd in JSON, XML en Protobuf — het is duidelijk te zien dat JSON compacter is dan XML, en Protobuf is het meest compact en tegelijkertijd onleesbaar.
JSON — minimalistische syntaxis, sleutels tussen aanhalingstekens, waarden van verschillende typen. Bezet 80 tekens. Leesbaarheid hoog, visuele structuur duidelijk. Geschikt voor API's waar ontwikkel- en debugsnelheid belangrijk is.
XML — elk element is verpakt in een openende en sluitende tag. Bezet 150 tekens. Leesbaarheid gemiddeld, structuur strikt. Geschikt voor documentstromen en systemen die validatie via XSD vereisen.
Protobuf — binair, 32 bytes voor deze gegevens. Onleesbaar — vereist deserialisatie voor weergave. Minimale grootte maakt het ideaal voor systemen met hoge belasting en mobiele applicaties.
{
"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>
Beste praktijken helpen veelvoorkomende fouten te voorkomen en de juiste serialisatiestrategie voor het project te kiezen. Het volgen van deze aanbevelingen verbetert de prestaties, beveiliging en onderhoudbaarheid van de code.
Serialisatiebeveiliging — een kritisch belangrijk aspect, vooral bij deserialisatie van gegevens uit onbetrouwbare bronnen. Aanvallen op deserialisatie kunnen leiden tot externe code-uitvoering (RCE), een van de gevaarlijkste kwetsbaarheden in web- en mobiele applicaties. De bekendste gevallen hebben betrekking op Java Serializable en Python pickle.
Protobuf en JSON hebben ingebouwde bescherming tegen dergelijke aanvallen, omdat ze alleen met gegevens werken, niet met willekeurige objecten. Java Serializable kan daarentegen elke klasse herstellen die beschikbaar is in de classpath, wat het gevaarlijk maakt voor het ontvangen van gegevens uit externe bronnen. Op Android wordt aanbevolen Kotlinx Serialization of Moshi te gebruiken in plaats van de standaard Java Serialization.
Aanvullende beveiligingsmaatregelen: stel een limiet in voor de grootte van invoergegevens, valideer het schema vóór deserialisatie, vertrouw niet op Content-Type uit HTTP-headers, gebruik een whitelist voor toegestane klassen. Werk serialisatiebibliotheken regelmatig bij, omdat kwetsbaarheden erin periodiek worden ontdekt en verholpen.
Veelgestelde vragen
Serialisatie zet een object om in een reeks bytes, marshalling verzendt gegevens tussen verschillende adresruimten met behoud van typen en structuur. Marshalling omvat serialisatie als onderdeel van het proces, maar kan ook het coderen van verwijzingen en geheugenbeheer omvatten.
FlatBuffers van Google biedt maximale snelheid dankzij zero-copy deserialisatie — gegevens worden rechtstreeks uit de binaire buffer gelezen zonder transformatie. Protobuf staat op de tweede plaats, JSON op de derde. XML is het langzaamste formaat van de gangbare.
Kotlinx Serialization — de beste keuze voor nieuwe projecten in Kotlin: compilatiegeneratie, ondersteuning voor Kotlin Multiplatform, null safety. Moshi — een goede keuze voor projecten in Java, beter presterend dan Gson. Gson — de eenvoudigste bibliotheek om mee te beginnen, maar langzamer en gebruikt reflectie.
Cyclische verwijzingen leiden tot oneindige recursie bij serialisatie. Oplossingen: gebruik ID-verwijzingen in plaats van directe verwijzingen naar objecten, pas speciale serialisatieadapters toe (bijv. @JsonIgnore in Jackson) of herontwerp het gegevensmodel om cycli te elimineren.
Ja, vooral deserialisatie van gegevens uit onbetrouwbare bronnen. Deserialisatiekwetsbaarheden kunnen leiden tot externe code-uitvoering. Aanbevelingen: deserialiseer geen gegevens uit onbetrouwbare bronnen, gebruik een whitelist van klassen bij deserialisatie en valideer het gegevensschema vóór verwerking.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook