Deserialisierung: Was es ist, Prozess der Datenwiederherstellung

Autor: IT Sectr Veröffentlicht: 2026-03-08 Lesezeit: 9 Min.

Deserialisierung ist der Prozess der Wiederherstellung eines Objekts aus einem JSON-, XML- oder Protobuf-Datenstrom, der für jede mobile Anwendung, die mit einer entfernten API arbeitet, unerlässlich ist. Laut Apple Developer (2026) ist die fehlerhafte Verarbeitung eingehender Daten nach wie vor eine der häufigen Ursachen für Abstürze auf Geräten. JSONDecoder auf iOS und Gson auf Android sind Standardwerkzeuge, aber jedes hat seine eigenen Eigenschaften und Einschränkungen.

Wichtige Punkte

  • Deserialisierung ist die Wiederherstellung eines typisierten Objekts aus JSON, XML oder Protobuf zur Verwendung im Code.
  • Codable ist Apples Protokoll für automatische Deserialisierung in Swift mit Unterstützung für Codegenerierung.
  • Moshi ist eine Android-Bibliothek von Square mit Codegen- und Reflexionsoptionen für verschiedene Szenarien.
  • Typkonflikt ist der häufigste Fehler, wenn JSON-Feldtypen und Modelleigenschaften nicht übereinstimmen.
  • kotlinx.serialization ist die offizielle Lösung von JetBrains mit compiler-sicherer Codegenerierung.

Was ist Deserialisierung?

Deserialisierung ist der Prozess der Umwandlung eines Bytestroms oder strukturierten Textes in ein Objekt einer Programmiersprache. In der mobilen Entwicklung findet dieser Prozess jedes Mal statt, wenn eine Anwendung eine Antwort vom Server erhält: Ein JSON-String wird in eine Instanz der Klasse User, Order oder Product umgewandelt. Die Stabilität der Bildschirme, die Daten anzeigen, hängt direkt von der Korrektheit der Deserialisierung ab.

Unterschied zur Serialisierung

Serialisierung und Deserialisierung sind zueinander inverse Prozesse, die in der Praxis selten symmetrisch sind. Serialisierung wandelt ein Objekt in einen String zum Senden an den Server um, während die Deserialisierung das Objekt aus dem empfangenen String wiederherstellt. Der Server kann ein Feld senden, das im Client-Modell nicht existiert, ein anderes Datumsformat verwenden oder null statt einer Zahl zurückgeben. Laut Square Engineering (2025) verursacht die Formatasymmetrie 23 % der Netzwerkschichtfehler in Android-Anwendungen. Um das Risiko zu verringern, werden Schema-Versionierung und strenge Vertragsspezifikation durch OpenAPI eingesetzt.

Datenformate für die Deserialisierung

JSON bleibt aufgrund seiner Lesbarkeit und integrierten Unterstützung das beliebteste Format für mobile APIs. Protobuf von Google wird in Hochlastsystemen verwendet — es ist 3- bis 6-mal kompakter als JSON und parst schneller, erfordert jedoch Codegenerierung aus .proto-Dateien und ist ohne Werkzeuge nicht lesbar. XML ist in modernen mobilen Anwendungen weniger verbreitet, wird aber in SOAP-Diensten von Unternehmenssystemen und Android-Konfigurationsdateien verwendet. MessagePack ist ein binäres Format, das in der Struktur JSON ähnelt, aber kompakter ist und in Echtzeitsystemen beliebt ist.

Wie funktioniert Deserialisierung

Der Deserialisierungsprozess durchläuft drei Phasen. Zuerst zerlegt die Tokenisierung den rohen Text in Token: Schlüssel, Zeichenketten, Zahlen und Trennzeichen. Dann überprüft die Syntaxanalyse die Korrektheit der Struktur — ob Klammern geschlossen sind, ob der Anführungszeichentyp korrekt ist, ob das Format RFC 8259 entspricht. Die letzte Phase ist das Mapping auf das Objektmodell der Anwendung, bei dem jedem JSON-Schlüssel unter Berücksichtigung der Namensstrategie eine Klasseneigenschaft zugewiesen wird.

Reflection vs. Codegenerierung

In der mobilen Entwicklung haben sich zwei Ansätze für das Mapping herausgebildet. Reflection (Gson, JSONSerialization) analysiert die Klassenstruktur zur Laufzeit über die Java Reflection API oder die Objective-C-Laufzeit — es ist flexibel und erfordert keine zusätzliche Konfiguration, ist aber langsamer und verbraucht mehr Speicher. Codegenerierung (Moshi codegen, kotlinx.serialization, Codable) generiert Code zur Compile-Zeit: schneller, typsicherer und gibt die interne Struktur nicht durch Reflection preis. JetBrains und Square empfehlen Codegenerierung für Produktions-Builds — die Leistungssteigerung erreicht das 2- bis 4-fache in Google-Benchmarks.

swift
struct User: Codable {
    let id: Int
    let name: String
    let email: String
    let createdAt: Date
}

let json = """
{
    "id": 42,
    "name": "Alice",
    "email": "alice@example.com",
    "created_at": "2026-06-01T12:00:00Z"
}
"""
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let user = try decoder.decode(User.self, from: data)

Beispiel für die Deserialisierung von JSON in ein User-Modell in Swift. Die Strategie convertFromSnakeCase wandelt automatisch Snake_case-API-Schlüssel in CamelCase-Modelleigenschaften um — eine Standardpraxis in iOS-Projekten. Der Parameter data sind die rohen Bytes der Serverantwort, die über URLSession empfangen wurden. Die Fehlerbehandlung durch try ermöglicht das Abfangen fehlerhafter JSON-Daten, ohne dass die Anwendung abstürzt.

Die Rolle der Decodierungsstrategien

JSONDecoder unterstützt vier Schlüsselstrategien: useDefaultKeys (genaue Übereinstimmung), convertFromSnakeCase (Snake_case → CamelCase), custom (Closure) und convertFromKebabCase (Kebab-case → CamelCase). Für Datumsangaben stehen .iso8601, .secondsSince1970, .millisecondsSince1970 und ein benutzerdefinierter dateFormatter zur Verfügung. Die Wahl der richtigen Strategie ist der erste Schritt zu einer robusten Deserialisierung, der die meisten Formatkonflikte verhindert.

Deserialisierung auf iOS

JSONDecoder ist der Standardmechanismus für die Deserialisierung im iOS SDK, der mit dem Codable-Protokoll arbeitet. JSONDecoder parst automatisch JSON in Struct- oder Class-Instanzen und unterstützt verschachtelte Objekte, Arrays und primitive Typen. Für benutzerdefinierte Logik wird die Methode init(from: Decoder) verwendet — sie ermöglicht die Behandlung nicht standardisierter Formate, fehlender Felder in einer älteren API-Version oder die Kombination mehrerer JSON-Schlüssel in einer Eigenschaft.

swift
struct Order: Decodable {
    let orderId: String
    let amount: Double
    let status: OrderStatus

    enum OrderStatus: String, Decodable {
        case pending, confirmed, shipped, cancelled
    }
}

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let order = try decoder.decode(Order.self, from: jsonData)

DateDecodingStrategy bestimmt, wie JSONDecoder Datumszeichenfolgen interpretiert. .iso8601 wird am häufigsten verwendet — das Standardformat für REST-APIs. Der verschachtelte Enum OrderStatus wird automatisch aus JSON-Stringwerten decodiert. Dies vermeidet magische Zahlen und macht den Code selbstdokumentierend — der Bestellstatus hat immer einen streng definierten Satz von Werten.

Property Wrappers in Codable

Seit Swift 4.2 unterstützt Codable Property Wrappers für die benutzerdefinierte Deserialisierung einzelner Eigenschaften. @DefaultValue ist ein beliebter Wrapper, der einen Standardwert setzt, wenn das Feld im JSON fehlt. @LosslessString wandelt einen String in eine Zahl um und umgekehrt. Dies ist besonders nützlich, wenn der Server eine ID als String "123" sendet, das Modell aber einen Int erwartet. Property Wrappers reduzieren Boilerplate-Code in init(from:) und machen Modelle sauberer.

Deserialisierung auf Android

Auf Android hängt die Wahl der Deserialisierungsbibliothek von der Sprache und den Projektanforderungen ab. Gson von Google ist die am häufigsten verwendete Option, die über Reflection arbeitet, aber bei komplexen Hierarchien Leistungsprobleme aufweist. Moshi von Square unterstützt sowohl Reflection als auch Codegenerierung, verbraucht weniger Speicher und verarbeitet große Antworten schneller. kotlinx.serialization von JetBrains ist eine native Kotlin-Lösung mit Compiler-Integration, die überhaupt keine Reflection verwendet.

kotlin
@Serializable
data class User(
    @SerialName("user_id")
    val userId: Int,
    val name: String,
    val email: String,
    @SerialName("created_at")
    val createdAt: String
)

val json = Json { ignoreUnknownKeys = true }
val user = json.decodeFromString<User>(response)

@Serializable ist eine Kotlin-Compiler-Annotation, die die Codegenerierung für die Klasse aktiviert. Der Parameter ignoreUnknownKeys verhindert Abstürze, wenn der Server ein im Modell fehlendes Feld sendet. Für das Mapping von Snake_case-Schlüsseln wird @SerialName verwendet — das Äquivalent zu convertFromSnakeCase aus iOS. Laut JetBrains (2026) unterstützt die Bibliothek plattformübergreifende Entwicklung: Dieselbe Serializable-Klasse funktioniert auf Android, iOS (KMP) und serverseitigem Kotlin.

Vergleich von Gson, Moshi und kotlinx.serialization

Die Wahl zwischen den Bibliotheken ist ein Kompromiss zwischen Geschwindigkeit und Flexibilität. Gson eignet sich gut für Prototypen und Java-Projekte — es benötigt keine Annotationen und funktioniert sofort. Moshi nimmt eine Mittelstellung ein: Codegen über @JsonClass(generateAdapter = true) bietet eine Geschwindigkeit, die nahe an kotlinx.serialization heranreicht, während der Reflection-Modus die Flexibilität von Gson bietet. kotlinx.serialization ist die schnellste Option für reine Kotlin-Projekte, erfordert aber Kotlin 1.4+ und das Kotlin Serialization-Plugin in Gradle.

BibliothekMechanismusGeschwindigkeitKMP
GsonReflectionNiedrigNein
MoshiReflection / CodegenMittel / HochNein
kotlinx.serializationCompiler-CodegenHochJa

Typische Fehler und ihre Vermeidung

Typkonflikt ist eine Situation, in der JSON einen Wert eines Typs enthält, das Modell aber einen anderen erwartet. Der Server hat den String "42" anstelle einer Zahl oder die Zahl 1 anstelle von Boolean true gesendet. Auf iOS löst JSONDecoder standardmäßig DecodingError.typeMismatch aus; auf Android versucht Gson eine Konvertierung, während Moshi und kotlinx.serialization explizite Adapter erfordern. Die Lösung ist die Verwendung von lenient-Strategien oder benutzerdefinierten Deserialisierern für bestimmte Felder.

Fehlende Felder und Nullable

Wenn der Server ein optionales Feld nicht enthält, stürzt der Code mit einem Fehler ab. Optional-Felder in Swift und nullable-Typen in Kotlin lösen das Problem: Wenn das Feld null ist oder im JSON fehlt, erhält die Eigenschaft nil/null und die Anwendung arbeitet weiter. Für erforderliche Felder sollte man deren Vorhandensein auf der API-Client-Ebene vor der Deserialisierung überprüfen. Moshi und kotlinx.serialization erfordern standardmäßig alle Felder — nullable-Markierungen und Standardwerte heben diese Einschränkung auf.

API-Versionsinkompatibilität

Änderungen an der JSON-Struktur auf dem Server sind eine häufige Ursache für Produktionsabstürze. Die Standardpraxis ist die Schema-Versionierung über ein version-Feld im Stammobjekt und die Unterstützung von 2-3 vorherigen Versionen auf dem Client. kotlinx.serialization ermöglicht es, mehrere Modelle für verschiedene Versionen zu deklarieren und das richtige anhand des version-Felds nach der anfänglichen Analyse in JsonElement auszuwählen. Zusätzlicher Schutz umfasst ignoreUnknownKeys für neue Felder und Standardwerte für Felder, die entfernt werden können.

FehlerSymptomBibliothek mit Schutz
TypkonfliktDecodingError / Ausnahmekotlinx — coerceInputValues = true
Fehlendes FeldAbsturz beim ZugriffMoshi — @Transient + default
Falsches DatumsformatDecodierungsfehlerJSONDecoder — dateDecodingStrategy
Zusätzliche FelderIgnoriert oder Absturzkotlinx — ignoreUnknownKeys = true
Null in Non-Null-FeldLaufzeitabsturzMoshi — lenient mit @Nullable

Protokollierung von Deserialisierungsfehlern ist eine obligatorische Praxis in der Produktion. Wickeln Sie decode in do/catch ein, protokollieren Sie das rohe JSON und den erwarteten Modelltyp in Crashlytics oder Sentry. Dadurch kann schnell identifiziert werden, welches Feld welcher API in welcher App-Version defekt ist. Ohne Protokollierung sieht ein Deserialisierungsfehler wie ein mysteriöser Absturz ohne Kontext aus.

Häufig gestellte Fragen

Wie unterscheidet sich die Deserialisierung vom Parsen?

Parsen ist die Analyse von strukturiertem Text in Bestandteile, ohne notwendigerweise ein typisiertes Modell zu erstellen. Die Deserialisierung ist ein spezieller Fall des Parsens, dessen Ergebnis ein vollwertiges Sprachobjekt mit bekannten Eigenschaftstypen ist. Parsen kann streamingbasiert sein, während die Deserialisierung immer ein vollständiges Objekt erzeugt.

Welche Deserialisierungsbibliothek sollte ich für ein neues Android-Projekt wählen?

Für ein reines Kotlin-Projekt wird kotlinx.serialization empfohlen — sie ist in den Compiler integriert, verwendet kein Reflection und unterstützt Kotlin Multiplatform. Für ein bestehendes Java-Projekt — Moshi mit Codegenerierung. Gson sollte man besser für Legacy-Projekte behalten, bei denen ein Austausch einen erheblichen Aufwand erfordern würde.

Was tun, wenn der Server Snake_case sendet, das Modell aber CamelCase verwendet?

Unter iOS verwenden Sie keyDecodingStrategy = .convertFromSnakeCase in JSONDecoder. Unter Android mit kotlinx.serialization verwenden Sie @SerialName für jedes Feld. In Moshi wenden Sie @Json(name="field_name") oder eine globale JsonAdapter.Factory an. Ein einheitlicher Stil auf Projektebene ist eine bewährte Praxis, die im API-Vertrag vereinbart wird.

Warum stürzt die Deserialisierung in der Produktion ab, aber nicht in der Entwicklung?

Der häufigste Grund ist ein unerwartetes null vom Server in einem als erforderlich deklarierten Feld. In der Entwicklung gibt der Server vollständige Daten zurück, in der Produktion eine verkürzte Antwort. Lösung: Markieren Sie alle potenziell fehlenden Felder als nullable (Kotlin) oder optional (Swift), verwenden Sie ignoreUnknownKeys und Standardwerte.

Was ist schneller — Reflection oder Codegenerierung bei der Deserialisierung?

Codegenerierung (Moshi codegen, kotlinx.serialization, Codable) ist in Google-Benchmarks 2- bis 4-mal schneller als Reflection. Neben der Geschwindigkeit ist die Codegenerierung typsicherer, erfordert keine Klassenmetadaten zur Laufzeit und Typfehler werden zur Compile-Zeit abgefangen, nicht während der Deserialisierung.

Zusammenfassung

  • Deserialisierung ist ein grundlegender Prozess der mobilen Entwicklung, der ein Objekt aus JSON, XML oder Protobuf zur Verwendung im Anwendungscode wiederherstellt.
  • iOS verwendet JSONDecoder mit dem Codable-Protokoll, das eine automatische Konvertierung von JSON in ein Modell mit Schlüssel- und Datumsstrategien bietet.
  • Android bietet drei Werkzeuge: Gson (Reflection), Moshi (Reflection/Codegen) und kotlinx.serialization (Compiler-Generierung über @Serializable).
  • Häufige Fehler — Typkonflikt, fehlende Felder, null in Non-Null-Feldern und API-Versionsinkompatibilität — werden durch nullable-Typen, ignoreUnknownKeys und Versionierung verhindert.
  • Codegenerierung ist sicherer und schneller als Reflection und wird daher für Produktions-Builds mobiler Anwendungen empfohlen.
  • Mapping-Strategie — keyDecodingStrategy auf iOS und @SerialName auf Android lösen die Namensstilkonflikte zwischen Server und Client.
  • Protokollieren Sie Deserialisierungsfehler unbedingt in Crashlytics oder Sentry für eine schnelle Diagnose von Produktionsvorfällen.

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.

Projekt besprechen

Lesen Sie auch