Serializadores Personalizados
Trate tipos especiais
Serializadores Personalizados é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.
Por que usar serializadores personalizados?
Alguns tipos não têm um serializador integrado: java.util.Date, LocalDate, UUID ou tipos de bibliotecas de terceiros.
Um serializador personalizado define como esse tipo é convertido de e para um formato serializado.
A interface KSerializer
Um serializador personalizado implementa KSerializer<T> com três membros: descriptor, serialize e deserialize.
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.EncoderUm serializador para LocalDate
Converta um LocalDate em uma cadeia ISO e vice-versa. O descritor o declara como uma cadeia 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())
}Usando @Serializable(with = ...)
Aplique o serializador a uma propriedade específica com @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 no nível do arquivo
Para evitar anotar cada propriedade, declare os serializadores uma vez por arquivo com @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)Serialização contextual
Registre serializadores globalmente no módulo Json { } e marque as propriedades com @Contextual. O serializador é resolvido em tempo de execução a partir do 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)Registrando um SerializersModule
Crie um módulo que associe o tipo ao seu serializador e passe-o para 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 compostos
Para tipos com vários campos, use encodeStructure / decodeStructure com um descritor estruturado em vez de um descritor primitivo.
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element
val descriptor = buildClassSerialDescriptor("Color") {
element<Int>("r")
element<Int>("g")
element<Int>("b")
}Padrão de tipo substituto
Uma alternativa mais simples é serializar uma classe de dados substituta privada que o compilador já reconhece e, em seguida, convertê-la de e para o seu tipo real. Isso exige menos código repetitivo do que a codificação e a decodificação manuais.
import kotlinx.serialization.Serializable
@Serializable
private data class ColorSurrogate(val r: Int, val g: Int, val b: Int)Escolhendo uma abordagem
Escolha a abordagem mais simples que atenda às suas necessidades:
- @Serializable(with=) — uma propriedade
- @UseSerializers — o arquivo inteiro
- @Contextual + módulo — em todo o aplicativo, resolvido em tempo de execução
- Tipo substituto — tipos compostos com o mínimo de código
Descritor primitivo vs. estruturado
O descritor deve corresponder à forma como você codifica:
- Valor único (cadeia/inteiro) →
PrimitiveSerialDescriptor - Vários campos →
buildClassSerialDescriptor
Uma incompatibilidade causa erros de serialização em tempo de execução.
Verificação rápida
Você quer serializar um único LocalDate como uma única cadeia ISO. Qual descritor é apropriado?
Recapitulação
Os serializadores personalizados lidam com tipos que o plug-in não reconhece:
- Implemente
KSerializer<T>com descritor + serialização + desserialização - Aplique por meio de
@Serializable(with=),@UseSerializersou@Contextual+ módulo - Associe o tipo do descritor à sua codificação
Isso conclui o curso de Serialização.
Perguntas Frequentes
A aula “Serializadores Personalizados” é grátis?
Sim — o texto completo de “Serializadores Personalizados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.
O que vou aprender em “Serializadores Personalizados”?
Trate tipos especiais Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Kotlin Academy?
Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Serializadores Personalizados”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Kotlin Academy?
Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Configuração de kotlinx.serialization
- Classes Serializáveis
- Codificação e Decodificação de JSON
- Serializadores Personalizados