Serialisatie en deserialisatie zijn fundamentele processen voor het omzetten van objecten naar een formaat voor overdracht of opslag. In mobiele ontwikkeling worden deze mechanismen gebruikt bij elk netwerkverzoek, statusopslag en interprocescommunicatie. Volgens MDN Web Docs, 2024 blijft JSON het populairste formaat voor serialisatie in web en mobiele apps, voorbijgaand aan XML en Protocol Buffers.
Belangrijkste
Serialisatie is het proces van het omzetten van een applicatieobject naar een formaat dat geschikt is voor verzending via een netwerk of opslag op schijf. Deserialisatie voert de omgekeerde conversie uit, waarbij het object wordt hersteld uit de ontvangen gegevens. In mobiele ontwikkeling wordt serialisatie toegepast bij API-verzoeken, het opslaan van de schermstatus, caching en gegevensoverdracht via Intent of Bundle.
Elke interactie tussen applicatiecomponenten of tussen de applicatie en de server vereist serialisatie. REST API verzenden gegevens in JSON of XML, gRPC gebruikt Protocol Buffers en intraprocescommunicatie op Android gebruikt Parcelable. Zonder serialisatie is het onmogelijk om een complex object over de procesgrens te sturen of op te slaan in de database.
// Algemeen principe van serialisatie
data class User(
val id: Int,
val name: String,
val email: String
)
// Serialisatie: object -> JSON
fun serializeUser(user: User): String {
return """{"id":${user.id},"name":"${user.name}","email":"${user.email}"}"""
}
// Deserialisatie: JSON -> object
fun deserializeUser(json: String): User? {
// JSON parseren naar object
return Gson().fromJson(json, User::class.java)
}
| Formaat | Grootte | Snelheid | Leesbaarheid | Typering |
|---|---|---|---|---|
| JSON | gemiddeld | hoog | hoog | dynamisch |
| XML | groot | gemiddeld | hoog | XSD-schema |
| Protocol Buffers | klein | zeer hoog | laag | strikt .proto |
| FlatBuffers | klein | maximaal | laag | strikt .fbs |
JSON (JavaScript Object Notation) is een lichtgewicht tekstformaat gebaseerd op de syntaxis van JavaScript-objecten. JSON ondersteunt tekenreeksen, getallen, booleaanse waarden, arrays en geneste objecten, wat de meeste scenario's voor gegevensoverdracht in mobiele applicaties dekt. Het formaat is platformonafhankelijk: elk ecosysteem biedt ingebouwde tools voor het parseren ervan.
JSON wint vanwege zijn eenvoud en universaliteit. De ontwikkelaar heeft geen schema nodig voor basisgebruik — de structuur wordt dynamisch bepaald tijdens het parseren. De leesbaarheid van het formaat vereenvoudigt debugging en testen: het serverantwoord kan in elke ontwikkeltool worden bekeken. Op beide mobiele platforms wordt JSON native verwerkt zonder dat externe bibliotheken nodig zijn.
// Codable — native JSON-serialisatie in Swift
struct User: Codable {
let id: Int
let name: String
let email: String
}
let jsonString = """{"id":1,"name":"John","email":"john@test.com"}"""
let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
let user = try! decoder.decode(User.self, from: jsonData)
Protocol Buffers (protobuf) is een binair serialisatieformaat ontwikkeld door Google voor hoogwaardige systemen. In tegenstelling tot JSON vereist protobuf voorafgaande definitie van het schema in een .proto-bestand, maar biedt het een aanzienlijk kleinere gegevensomvang en hogere verwerkingssnelheid. Het formaat wordt gebruikt in gRPC, Firebase Firestore en interne services van Google.
Het protobuf-schema beschrijft berichten met getypeerde velden, elk met een uniek nummer. De protoc-compiler genereert klassen in de gewenste taal die automatisch serialisatie en deserialisatie uitvoeren. Protobuf ondersteunt schema-evolutie via regels voor het toevoegen en verwijderen van velden zonder verlies van achterwaartse compatibiliteit.
// Schema definiëren in user.proto
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
repeated string roles = 4;
}
// Gegenereerde code in Kotlin
val user = UserProto.User.newBuilder()
.setId(1)
.setName("John")
.setEmail("john@test.com")
.build()
val bytes: ByteArray = user.toByteArray()
XML (eXtensible Markup Language) is een formaat met een strikte structuur, ondersteuning voor naamruimten en validatie via XSD-schema's. XML verliest van JSON in compactheid en parsesnelheid, maar blijft in trek bij Android-ontwikkeling voor layout-bestanden, AndroidManifest, bronnen en Gradle-configuraties. Op iOS wordt XML gebruikt in plist-bestanden en sommige oudere services.
Android biedt drie methoden om XML te parsen: DOM (het hele document in het geheugen laden), SAX (event-georiënteerd stream-parsen) en XmlPullParser (hybride aanpak). XmlPullParser is de aanbevolen optie voor mobiele apparaten, omdat het efficiënt werkt met beperkt geheugen en het document tijdens het lezen kan verwerken.
// XmlPullParser op Android
fun parseUserXml(inputStream: InputStream): User? {
val parser = Xml.newPullParser()
parser.setInput(inputStream, Xml.Encoding.UTF_8.name)
var id: Int? = null
var name: String? = null
var email: String? = null
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.eventType == XmlPullParser.START_TAG
&& parser.name == "email") {
email = parser.nextText()
}
}
return User(id!!, name!!, email!!)
}
Elk platform biedt zijn eigen tools voor serialisatie. Op iOS is het belangrijkste mechanisme het Codable-protocol met JSONEncoder en JSONDecoder, en voor Objective-C — NSJSONSerialization. Android gebruikt de bibliotheken Gson, Moshi en kotlinx.serialization. Voor gegevensoverdracht tussen processen gebruikt Android Parcelable en iOS gebruikt NSKeyedArchiver. Kotlin-projecten kiezen steeds vaker voor kotlinx.serialization — een oplossing van JetBrains die multiplatform ondersteunt en niet afhankelijk is van reflectie, waarbij serialisatoren worden gegenereerd tijdens de compilatiefase via een Kotlin-compiler-plugin.
Android ondersteunt twee serialisatiemechanismen voor Intent en Bundle. Serializable is het standaard Java-mechanisme dat reflectie gebruikt, wat leidt tot lage prestaties. Parcelable is een Android-specifiek protocol dat handmatige implementatie van de methoden writeToParcel en createFromParcel vereist, maar tientallen keren sneller werkt dankzij directe manipulatie van bytes.
// Parcelable op Android
@Parcelize
data class UserParcel(
val id: Int,
val name: String,
val email: String
) : Parcelable
// Overdracht via Intent
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", userParcel)
startActivity(intent)
Op iOS wordt voor gegevensoverdracht tussen controllers Codable gebruikt met voorafgaande serialisatie naar Data, en voor interprocescommunicatie — NSKeyedArchiver, die objecten omzet in het binaire Property List-formaat. Moderne projecten in SwiftUI geven de voorkeur aan het coderen van gegevens via JSONEncoder voor overdracht tussen applicatiemodules.
Onjuiste deserialisatie van niet-vertrouwde gegevens kan leiden tot kwetsbaarheden. Aanvallen via serialisatie maken misbruik van overschreven readObject-methoden in Java of onveilige deserialisatoren van externe bibliotheken. Op Android moet Serializable worden vermeden voor gegevens uit niet-vertrouwde bronnen, in plaats daarvan Parcelable of handmatige validatie van alle velden na deserialisatie gebruiken. Op iOS is JSONDecoder standaard strikt met betrekking tot typen, maar bij het werken met JSONSerialization moet de ontwikkelaar typen controleren via conditionele conversie.
Bij het kiezen van een serialisatieformaat worden prestatie-eisen, gegevensomvang en compatibiliteit in overweging genomen. Voor REST API en microservice-architectuur blijft JSON de optimale keuze — het wordt ondersteund door alle platforms en talen. Voor systemen met hoge belasting en mobiele applicaties met beperkt verkeer hebben Protocol Buffers de voorkeur, die kleinere omvang en snellere deserialisatie bieden. XML is alleen gerechtvaardigd in configuratiescenario's en bij integratie met legacy-systemen. In moderne projecten wint ook FlatBuffers aan populariteit — een binair formaat zonder deserialisatiefase, gebruikt in game-engines en applicaties met minimale latentie. Elk formaat heeft zijn eigen niche en de juiste keuze heeft directe invloed op de snelheid van de applicatie en de hoeveelheid verbruikt verkeer.
Veelgestelde vragen
Serialisatie is het verpakken van een applicatieobject in een formaat dat via een netwerk kan worden verzonden of in een bestand kan worden opgeslagen. Stel je voor dat je een foto maakt van een object — de foto is serialisatie en het herstellen van het object uit de foto is deserialisatie.
JSON is een tekstformaat dat leesbaar is voor mensen en geen schema vereist. Protocol Buffers is een binair formaat met een verplicht schema (.proto), aanzienlijk kleinere omvang en hogere snelheid. Protobuf wordt gekozen voor systemen met hoge belasting, JSON voor universele compatibiliteit.
XML blijft de standaard voor configuratiebestanden (AndroidManifest, layout-bronnen), documenten met complexe nesting en systemen met strikte validatie via XSD. XML wordt ook toegepast in SOAP-protocollen en legacy-systemen waar ondersteuning voor naamruimten vereist is.
Codable is een Swift-protocol dat Encodable en Decodable combineert voor automatische serialisatie en deserialisatie. De compiler genereert de implementatie van de methoden encode(to:) en init(from:) voor alle eigenschappen van de structuur of klasse.
Parcelable werkt aanzienlijk sneller dan Serializable, omdat het geen reflectie gebruikt en velden direct naar de bytestroom schrijft. Op moderne apparaten kan het verschil oplopen tot een 10-voudige versnelling in het voordeel van Parcelable.
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