Serialisierung ist der Prozess der Umwandlung eines Objekts oder einer Datenstruktur in ein sequenzielles Format, das für die Netzwerkübertragung oder Dateispeicherung geeignet ist. Der umgekehrte Prozess, die Deserialisierung, stellt die Daten wieder in ihren ursprünglichen Zustand zurück. Laut MDN Web Docs ist Serialisierung für jede prozessübergreifende Kommunikation notwendig. Serialisierung liegt REST-APIs, Caching und dem Datenaustausch zwischen Anwendungskomponenten zugrunde.
Wichtigste Punkte
Serialisierung ist der Prozess der Umwandlung eines im RAM befindlichen Objekts in eine lineare Folge von Bytes oder Zeichen, die über ein Netzwerk übertragen, in einer Datei gespeichert oder an einen anderen Prozess übergeben werden kann. Ohne Serialisierung wären Netzwerkkommunikation, Zustandsspeicherung und prozessübergreifende Interaktion unmöglich.
Serialisierung umfasst zwei gegenläufige Prozesse. Der Vorwärtsprozess (Serialisierung) verpackt Daten in ein Übertragungsformat. Der Rückwärtsprozess (Deserialisierung) stellt die Daten wieder als Objekt her. Deserialisierung ist für die Sicherheit kritisch: falsche Eingabedaten können zu Schwachstellen in der Anwendung führen.
In der mobilen Anwendungsentwicklung wird Serialisierung überall eingesetzt: Senden von Anfragen an den Server und Verarbeiten von Antworten, Speichern des Anwendungszustands bei Bildschirmdrehung, Zwischenspeichern von Daten auf der Festplatte und Übergeben von Daten zwischen Bildschirmen über Intent (Android) oder Segue (iOS).
Serialisierungsformate werden in Text- und Binärformate unterteilt. Textformate (JSON, XML) sind für Menschen lesbar und benötigen keine Werkzeuge zur Anzeige. Binärformate (Protobuf, FlatBuffers, MessagePack) sind kompakter und schneller, aber ohne Deserialisierung nicht lesbar. Die Formatwahl ist ein Kompromiss zwischen Leistung und Debugging-Komfort.
Neben JSON, XML und Protobuf gibt es spezialisierte Formate: FlatBuffers von Google für Spiele und AR, MessagePack — eine kompakte binäre Alternative zu JSON, Avro von Apache für Big Data in Kafka, YAML — ein Konfigurationsformat mit Kommentarunterstützung.
| Format | Typ | Schema | Größe | Geschwindigkeit |
|---|---|---|---|---|
| JSON | Text | Optional | Mittel | Mittel |
| XML | Text | XSD | Groß | Niedrig |
| Protobuf | Binär | Erforderlich | Klein | Hoch |
| FlatBuffers | Binär | Erforderlich | Klein | Maximal |
| MessagePack | Binär | Nein | Klein | Hoch |
| Avro | Binär | JSON Schema | Klein | Hoch |
Serialisierung auf mobilen Plattformen hat ihre Besonderheiten: begrenzter Datenverkehr, schwächere Prozessoren und die Notwendigkeit, den Zustand bei Bildschirmdrehungen zu erhalten. Auf Android werden Gson, Moshi, Kotlinx Serialization verwendet. Auf iOS — Codable, JSONSerialization, PropertyListEncoder. Die richtige Bibliothekswahl beeinflusst die Anwendungsleistung entscheidend.
Kotlinx Serialization ist eine moderne Bibliothek von JetBrains für Kotlin Multiplatform Mobile. Sie unterstützt JSON, Protobuf, CBOR und benutzerdefinierte Formate. Die Codegenerierung erfolgt zur Kompilierungszeit über das Kotlin Serialization Plugin und gewährleistet hohe Leistung ohne Reflexion.
Die Bibliothek Kotlinx Serialization verwendet die Annotation @Serializable für Klassen und ein Compiler-Plugin zum Generieren von Serialisierern. Dies gewährleistet hohe Leistung und Typsicherheit. Das Standardformat ist JSON, aber andere Formate werden über zusätzliche Module unterstützt.
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)
// Serialisierung
val jsonString = json.encodeToString(project)
// Deserialisierung
val restored = json.decodeFromString<Project>(jsonString)
}
Das Codable-Protokoll ist der integrierte Serialisierungsmechanismus von Swift. Es kombiniert die Protokolle Encodable (Serialisierung) und Decodable (Deserialisierung). JSONEncoder und JSONDecoder verarbeiten automatisch verschachtelte Strukturen, Arrays, optionale Werte und benutzerdefinierte Schlüssel über 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)
Die Leistung von Serialisierungsformaten wird anhand von drei Metriken bewertet: Nachrichtengröße, Serialisierungsgeschwindigkeit und Deserialisierungsgeschwindigkeit. Für mobile Anwendungen sind alle drei kritisch: Die Größe beeinflusst den Datenverkehr und die Ladezeit, die Geschwindigkeit beeinflusst die Reaktionsfähigkeit der Oberfläche und die Startzeit der Anwendung.
Protobuf und FlatBuffers zeigen dank binärer Darstellung die besten Ergebnisse. FlatBuffers zeichnet sich dadurch aus, dass es keinen separaten Deserialisierungsschritt erfordert — Daten werden direkt aus dem binären Puffer gelesen, was es ideal für Spiele und AR-Anwendungen mit minimalen Latenzanforderungen macht. JSON bleibt trotz schlechterer Leistung aufgrund seiner Einfachheit und Universalität das beliebteste Format für REST-APIs.
| Szenario | Empfohlenes Format | Grund |
|---|---|---|
| REST-API | JSON | Universalität, Lesbarkeit, Unterstützung |
| Mikroservices | Protobuf | Kompaktheit, Geschwindigkeit, gRPC |
| Spiele / AR | FlatBuffers | Zero-Copy, minimale Latenz |
| Big Data | Avro | Kompatibilität mit Kafka und Hadoop |
| Konfiguration | YAML | Kommentare, Lesbarkeit |
| Android-Layouts | XML | Plattformstandard |
Praktische Tests mit einem Datensatz von 1000 Benutzerobjekten zeigen: Protobuf erstellt Nachrichten mit 12 KB (JSON — 85 KB, XML — 120 KB). Serialisierungszeit: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Diese Zahlen machen Binärformate für Hochlastsysteme und mobile Anwendungen mit begrenztem Datenverkehr bevorzugt.
Die Beispiele zeigen die Serialisierung desselben Objekts in verschiedenen Formaten. Dies hilft, Größe und Lesbarkeit visuell zu vergleichen. Dasselbe User-Objekt wird in JSON, XML und Protobuf serialisiert — es ist deutlich sichtbar, dass JSON kompakter als XML ist und Protobuf am kompaktesten und dabei unlesbar ist.
JSON — minimalistische Syntax, Schlüssel in Anführungszeichen, Werte verschiedener Typen. Benötigt 80 Zeichen. Lesbarkeit hoch, visuelle Struktur klar. Geeignet für APIs, bei denen Entwicklungs- und Debugging-Geschwindigkeit wichtig sind.
XML — jedes Element ist in öffnende und schließende Tags gehüllt. Benötigt 150 Zeichen. Lesbarkeit mittel, Struktur streng. Geeignet für Dokumentenworkflows und Systeme, die eine XSD-Validierung erfordern.
Protobuf — binär, 32 Bytes für diese Daten. Unlesbar — erfordert Deserialisierung zur Anzeige. Die minimale Größe macht es ideal für Hochlastsysteme und mobile Anwendungen.
{
"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>
Best Practices helfen, typische Fehler zu vermeiden und die richtige Serialisierungsstrategie für das Projekt zu wählen. Die Befolgung dieser Empfehlungen verbessert Leistung, Sicherheit und Wartbarkeit des Codes.
Serialisierungssicherheit ist ein kritisch wichtiger Aspekt, insbesondere bei der Deserialisierung von Daten aus nicht vertrauenswürdigen Quellen. Deserialisierungsangriffe können zur Remote-Code-Ausführung (RCE) führen, einer der gefährlichsten Schwachstellen in Web- und Mobilanwendungen. Die bekanntesten Fälle betreffen Java Serializable und Python pickle.
Protobuf und JSON haben einen integrierten Schutz gegen solche Angriffe, da sie nur mit Daten arbeiten, nicht mit beliebigen Objekten. Java Serializable kann dagegen jede im Klassenpfad verfügbare Klasse wiederherstellen, was es für den Empfang von Daten aus externen Quellen gefährlich macht. Auf Android wird empfohlen, Kotlinx Serialization oder Moshi anstelle der standardmäßigen Java-Serialisierung zu verwenden.
Zusätzliche Sicherheitsmaßnahmen: Legen Sie ein Limit für die Größe der Eingabedaten fest, validieren Sie das Schema vor der Deserialisierung, vertrauen Sie nicht dem Content-Type aus HTTP-Headern, verwenden Sie eine Whitelist für zulässige Klassen. Aktualisieren Sie Serialisierungsbibliotheken regelmäßig, da Schwachstellen regelmäßig entdeckt und behoben werden.
Häufig gestellte Fragen
Serialisierung wandelt ein Objekt in eine Byte-Sequenz um, während Marshalling Daten zwischen verschiedenen Adressräumen unter Beibehaltung von Typen und Struktur überträgt. Marshalling enthält Serialisierung als Teil des Prozesses, kann aber auch Referenzcodierung und Speicherverwaltung umfassen.
Googles FlatBuffers bietet maximale Geschwindigkeit dank Zero-Copy-Deserialisierung — Daten werden direkt aus dem binären Puffer ohne Transformation gelesen. Protobuf liegt auf Platz zwei, JSON auf Platz drei. XML ist das langsamste Format unter den gängigen.
Kotlinx Serialization ist die beste Wahl für neue Kotlin-Projekte: Compiler-Generierung, Kotlin-Multiplatform-Unterstützung, Null-Sicherheit. Moshi ist eine gute Wahl für Java-Projekte, leistungsfähiger als Gson. Gson ist die einfachste Bibliothek für den Einstieg, aber langsamer und verwendet Reflexion.
Zirkuläre Referenzen führen während der Serialisierung zu unendlicher Rekursion. Lösungen: Verwenden Sie ID-Referenzen anstelle direkter Objektreferenzen, wenden Sie spezialisierte Serialisierungsadapter an (z. B. @JsonIgnore in Jackson), oder gestalten Sie das Datenmodell neu, um Zyklen zu vermeiden.
Ja, insbesondere die Deserialisierung nicht vertrauenswürdiger Daten. Deserialisierungsschwachstellen können zur Remote-Code-Ausführung führen. Empfehlungen: Deserialisieren Sie keine Daten aus nicht vertrauenswürdigen Quellen, verwenden Sie eine Whitelist von Klassen bei der Deserialisierung und validieren Sie das Datenschema vor der Verarbeitung.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch