Objekt-Serialisierung in Kotlin: Überblick über Bibliotheken und praktischer Leitfaden
\n\nSerialisierung ist der Prozess der Umwandlung komplexer Objekte (Klassen, Datenstrukturen) in ein Format, das für die Speicherung oder Übertragung über ein Netzwerk geeignet ist (JSON, XML, Protobuf). Die umgekehrte Operation – Deserialisierung – stellt das Objekt aus einem solchen Format wieder her. In Kotlin ist die Serialisierung dank seiner Prägnanz und Typsicherheit besonders elegant umgesetzt. In diesem Artikel betrachten wir drei Hauptansätze: die Standardbibliothek kotlinx.serialization sowie die beliebten Java-Lösungen Gson und Jackson, die für Kotlin angepasst wurden.
1. kotlinx.serialization – die offizielle Lösung von JetBrains
\n\nDie Bibliothek kotlinx.serialization ist Teil des Kotlin-Ökosystems und wird von den Sprachentwicklern unterstützt. Sie bietet einen nativen Ansatz ohne Reflexion, was eine hohe Leistung und Typsicherheit zur Kompilierzeit gewährleistet.
Einbindung (Gradle)
\nplugins {\n kotlin("jvm") version "1.9.0"\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\n\nBeispiel: Basisklasse und Serialisierung
\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val age: Int,\n val email: String? = null\n)\n\nfun main() {\n val user = User("Alexej", 30, "alex@example.com")\n val jsonString = Json.encodeToString(user)\n println(jsonString)\n // {"name":"Alexej","age":30,"email":"alex@example.com"}\n\n val decoded = Json.decodeFromString<User>(jsonString)\n println(decoded) // User(name=Alexej, age=30, email=alex@example.com)\n}\n\nVorteile
\n- \n
- Typsicherheit: Serialisierungsfehler werden zur Kompilierzeit erkannt. \n
- Multiplattform-Unterstützung: Funktioniert auf JVM, JS, Native (KMP). \n
- Erweiterbarkeit: Benutzerdefinierte Serialisierer für komplexe Typen. \n
- Integrierte Unterstützung für null, enum, sealed class, Sammlungen. \n
Fortgeschrittenes Beispiel: verschachtelte Objekte und Listen
\n@Serializable\ndata class Address(val city: String, val street: String)\n\n@Serializable\ndata class Person(val name: String, val addresses: List<Address>)\n\nfun main() {\n val person = Person("Maria", listOf(\n Address("Moskau", "Twerskaja"),\n Address("SPb", "Newski")\n ))\n val json = Json { prettyPrint = true }\n println(json.encodeToString(person))\n // {\n // "name": "Maria",\n // "addresses": [\n // { "city": "Moskau", "street": "Twerskaja" },\n // { "city": "SPb", "street": "Newski" }\n // ]\n // }\n}\n\n2. Gson – leichtgewichtig und einfach
\n\nDie Bibliothek Gson von Google ist in der Java-Welt weit verbreitet. Für Kotlin wird sie mit zusätzlicher Konfiguration verwendet, um data class und nullable-Felder korrekt zu verarbeiten.
Einbindung
\nimplementation("com.google.code.gson:gson:2.10.1")\n\nBeispiel mit Gson
\nimport com.google.gson.Gson\nimport com.google.gson.reflect.TypeToken\n\ndata class Product(val id: Int, val title: String, val price: Double?)\n\nfun main() {\n val gson = Gson()\n val product = Product(1, "Laptop", 75000.0)\n val json = gson.toJson(product)\n println(json) // {"id":1,"title":"Laptop","price":75000.0}\n\n val back = gson.fromJson(json, Product::class.java)\n println(back) // Product(id=1, title=Laptop, price=75000.0)\n}\n\nBesonderheiten
\n- \n
- Erfordert keine Annotationen – funktioniert mit allen Klassen. \n
- Erfordert die explizite Angabe des Typs bei der Deserialisierung (kann bei Generics umständlich sein). \n
- Standardmäßig werden keine
Auch in der Bibliothek
Sharp für JavaScript (Node.js): Komplettguide mit Beispielen
PyNaCl – Kryptografie-Bibliothek für Python
Arbeiten mit YAML in C++: Die Bibliothek yaml-cpp für Parsing und Serialisierung
Arbeit mit Kafka in Rust: Bibliotheken rdkafka und Franz
Abhängigkeitsinjektion (Dependency Injection) in C++: Container und Praxis