Serializadores personalizados
Gestione tipos especiales
Serializadores personalizados es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Por qué usar serializadores personalizados?
Algunos tipos no tienen un serializador integrado: java.util.Date, LocalDate, UUID o tipos de bibliotecas de terceros.
Un serializador personalizado define cómo se convierte ese tipo a una forma serializada y cómo se recupera a partir de ella.
La interfaz KSerializer
Un serializador personalizado implementa KSerializer<T> con tres miembros: descriptor, serialize y deserialize.
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.EncoderUn serializador para LocalDate
Convierta un LocalDate a una cadena ISO y viceversa. El descriptor lo declara como una cadena primitiva.
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())
}Usar @Serializable(with = ...)
Aplique el serializador a una propiedad específica con @Serializable(with = ...).
import java.time.LocalDate
import kotlinx.serialization.Serializable
@Serializable
data class Event(
val name: String,
@Serializable(with = LocalDateSerializer::class)
val date: LocalDate
)@UseSerializers a nivel de archivo
Para evitar anotar cada propiedad, declare los serializadores una sola vez por archivo con @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)Serialización contextual
Registre los serializadores globalmente en el módulo de Json { } y marque las propiedades con @Contextual. El serializador se resuelve en tiempo de ejecución a partir del módulo.
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import java.time.LocalDate
@Serializable
data class Event(val name: String, @Contextual val date: LocalDate)Registrar un SerializersModule
Construya un módulo que vincule el tipo con su serializador y páselo a 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 }Serializadores compuestos
Para tipos con varios campos, use encodeStructure / decodeStructure con un descriptor estructurado en lugar de uno primitivo.
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element
val descriptor = buildClassSerialDescriptor("Color") {
element<Int>("r")
element<Int>("g")
element<Int>("b")
}Patrón de sustituto
Una alternativa más sencilla es serializar una clase de datos sustituta privada que el compilador ya admite y, después, convertirla a su tipo real y viceversa. Requiere menos código repetitivo que implementar la codificación y decodificación manualmente.
import kotlinx.serialization.Serializable
@Serializable
private data class ColorSurrogate(val r: Int, val g: Int, val b: Int)Elegir un enfoque
Elija el enfoque más sencillo que se ajuste a sus necesidades:
- @Serializable(with=) — una propiedad
- @UseSerializers — todo el archivo
- @Contextual + módulo — para toda la aplicación, resuelto en tiempo de ejecución
- Sustituto — tipos compuestos con un mínimo de código
Descriptor primitivo o estructurado
El descriptor debe coincidir con la forma en que codifica los datos:
- Un único valor (cadena o entero) →
PrimitiveSerialDescriptor - Varios campos →
buildClassSerialDescriptor
Una discrepancia provoca errores de serialización en tiempo de ejecución.
Comprobación rápida
Quiere serializar un único LocalDate como una cadena ISO. ¿Qué descriptor es adecuado?
Resumen
Los serializadores personalizados gestionan los tipos que el plugin no conoce:
- Implemente
KSerializer<T>con descriptor, serialize y deserialize - Aplíquelo mediante
@Serializable(with=),@UseSerializerso@Contextual+ módulo - Haga coincidir el tipo de descriptor con su forma de codificación
Con esto concluye el curso sobre Serialization.
Preguntas frecuentes
¿La lección «Serializadores personalizados» es gratis?
Sí — el texto completo de «Serializadores personalizados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Serializadores personalizados»?
Gestione tipos especiales Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Serializadores personalizados»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Configuración de kotlinx.serialization
- Clases serializables
- Codificación y decodificación JSON
- Serializadores personalizados