0Pricing
Kotlin Academy · Lektion

Benutzerdefinierte Serialisierer

Behandeln Sie spezielle Typen

Benutzerdefinierte Serialisierer ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum benutzerdefinierte Serializer?

Für einige Typen gibt es keinen integrierten Serializer: java.util.Date, LocalDate, UUID oder Typen aus Bibliotheken von Drittanbietern.

Ein benutzerdefinierter Serializer legt fest, wie ein solcher Typ auf eine serialisierte Form abgebildet und daraus wiederhergestellt wird.

Das KSerializer-Interface

Ein benutzerdefinierter Serializer implementiert KSerializer<T> mit drei Membern: descriptor, serialize und deserialize.

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

Ein Serializer für LocalDate

Ordnen Sie ein LocalDate einem ISO-String zu und umgekehrt. Der Descriptor gibt an, dass es sich um einen primitiven String handelt.

import java.time.LocalDate
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

object LocalDateSerializer : KSerializer<LocalDate> {
    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING)
    override fun serialize(encoder: Encoder, value: LocalDate) =
        encoder.encodeString(value.toString())
    override fun deserialize(decoder: Decoder): LocalDate =
        LocalDate.parse(decoder.decodeString())
}

@Serializable(with = ...) verwenden

Wenden Sie den Serializer mit @Serializable(with = ...) auf eine bestimmte Property an.

import java.time.LocalDate
import kotlinx.serialization.Serializable

@Serializable
data class Event(
    val name: String,
    @Serializable(with = LocalDateSerializer::class)
    val date: LocalDate
)

@UseSerializers auf Dateiebene

Um nicht jede Property annotieren zu müssen, deklarieren Sie Serializer einmal pro Datei mit @file:UseSerializers.

@file:UseSerializers(LocalDateSerializer::class)

import kotlinx.serialization.UseSerializers
import java.time.LocalDate
import kotlinx.serialization.Serializable

@Serializable
data class Event(val name: String, val date: LocalDate)

Kontextbezogene Serialisierung

Registrieren Sie Serializer global im Json { }-Modul und markieren Sie Properties mit @Contextual. Der Serializer wird zur Laufzeit aus dem Modul aufgelöst.

import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import java.time.LocalDate

@Serializable
data class Event(val name: String, @Contextual val date: LocalDate)

Ein SerializersModule registrieren

Erstellen Sie ein Modul, das den Typ an seinen Serializer bindet, und übergeben Sie es an Json.

import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import java.time.LocalDate

val module = SerializersModule {
    contextual(LocalDate::class, LocalDateSerializer)
}
val json = Json { serializersModule = module }

Zusammengesetzte Serializer

Verwenden Sie für Typen mit mehreren Feldern encodeStructure / decodeStructure mit einem strukturierten Descriptor statt eines primitiven.

import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element

val descriptor = buildClassSerialDescriptor("Color") {
    element<Int>("r")
    element<Int>("g")
    element<Int>("b")
}

Das Surrogat-Muster

Eine einfachere Alternative: Serialisieren Sie eine private Surrogat-Data-Class, die der Compiler bereits unterstützt, und ordnen Sie sie Ihrem tatsächlichen Typ zu und umgekehrt. Das verursacht weniger Boilerplate als die manuelle Kodierung und Dekodierung.

import kotlinx.serialization.Serializable

@Serializable
private data class ColorSurrogate(val r: Int, val g: Int, val b: Int)

Den passenden Ansatz wählen

Wählen Sie den leichtesten passenden Ansatz:

  • @Serializable(with=) — eine Property
  • @UseSerializers — die gesamte Datei
  • @Contextual + Modul — für die gesamte Anwendung, zur Laufzeit aufgelöst
  • Surrogat — zusammengesetzte Typen mit minimalem Code

Primitiver oder strukturierter Descriptor

Der Descriptor muss der Kodierungsart entsprechen:

  • Einzelner Wert (String/Int) → PrimitiveSerialDescriptor
  • Mehrere Felder → buildClassSerialDescriptor

Eine Abweichung verursacht Serialisierungsfehler zur Laufzeit.

Schnelltest

Sie möchten ein einzelnes LocalDate als einen ISO-String serialisieren. Welcher Descriptor ist geeignet?

Zusammenfassung

Benutzerdefinierte Serializer verarbeiten Typen, die dem Plugin unbekannt sind:

  • KSerializer<T> mit Descriptor, serialize und deserialize implementieren
  • Über @Serializable(with=), @UseSerializers oder @Contextual + Modul anwenden
  • Die Art des Descriptors an die Kodierung anpassen

Damit ist der Kurs zu Serialization abgeschlossen.

Häufig gestellte Fragen

Ist die Lektion „Benutzerdefinierte Serialisierer“ kostenlos?

Ja — der vollständige Text von „Benutzerdefinierte Serialisierer“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Benutzerdefinierte Serialisierer“?

Behandeln Sie spezielle Typen Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Benutzerdefinierte Serialisierer“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. kotlinx.serialization einrichten
  2. Serializable-Klassen
  3. JSON-Kodierung und -Dekodierung
  4. Benutzerdefinierte Serialisierer
← Zurück zu Kotlin Academy