Kotlin Academy · Oppitunti

Mukautetut serialisoijat

Käsittele erikoistyyppejä

Oppitunti 4/413 vaihetta

Mukautetut serialisoijat on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Miksi mukautettuja serialisoijia tarvitaan

Joillekin tyypeille ei ole sisäänrakennettua serialisoijaa: java.util.Date, LocalDate, UUID tai kolmannen osapuolen kirjastoista peräisin olevat tyypit.

Mukautettu serialisoija määrittää, miten tällainen tyyppi muunnetaan serialisoitavaan muotoon ja siitä takaisin.

KSerializer-rajapinta

Mukautettu serialisoija toteuttaa KSerializer<T>-rajapinnan, jossa on kolme jäsentä: descriptor, serialize ja deserialize.

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

LocalDate-serialisoija

Muuntakaa LocalDate ISO-merkkijonoksi ja takaisin. Descriptor ilmoittaa sen primitiiviseksi merkkijonoksi.

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 = ...) -annotaation käyttäminen

Liittäkää serialisoija tiettyyn ominaisuuteen käyttämällä @Serializable(with = ...)-annotaatiota.

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

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

Tiedostotason @UseSerializers

Jotta jokaista ominaisuutta ei tarvitse merkitä erikseen, määrittäkää serialisoijat kerran tiedostoa kohden käyttämällä @file:UseSerializers-annotaatiota.

@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)

Kontekstuaalinen serialisointi

Rekisteröikää serialisoijat maailmanlaajuisesti Json { }-moduuliin ja merkitkää ominaisuudet @Contextual-annotaatiolla. Serialisoija ratkaistaan ajonaikana moduulista.

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

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

SerializersModule-moduulin rekisteröinti

Rakentakaa moduuli, joka sitoo tyypin serialisoijaansa, ja välittäkää se Json-oliolle.

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 }

Yhdistelmäserialisoijat

Monikenttäisissä tyypeissä käyttäkää encodeStructure- ja decodeStructure-funktioita rakenteisen descriptorin kanssa primitiivisen sijaan.

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

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

Surrogaattimalli

Yksinkertaisempi vaihtoehto on serialisoida yksityinen surrogaatti-data-luokka, jota kääntäjä jo tukee, ja muuntaa se todelliseksi tyypiksi ja takaisin. Näin käsin tehtävää encode/decode-koodia tarvitaan vähemmän.

import kotlinx.serialization.Serializable

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

Lähestymistavan valinta

Valitkaa tilanteeseen sopiva kevyin lähestymistapa:

  • @Serializable(with=) — yksi ominaisuus
  • @UseSerializers — koko tiedosto
  • @Contextual + moduuli — koko sovellus, ratkaisu tehdään ajonaikana
  • Surrogaatti — yhdistelmätyypit vähäisellä koodimäärällä

Primitiivinen vai rakenteinen descriptor

Descriptorin on vastattava enkoodauksen rakennetta:

  • Yksi arvo (merkkijono/kokonaisluku) → PrimitiveSerialDescriptor
  • Useita kenttiä → buildClassSerialDescriptor

Ristiriita aiheuttaa ajonaikaisia serialisointivirheitä.

Pikatarkistus

Haluatte serialisoida yhden LocalDate-arvon yhdeksi ISO-merkkijonoksi. Mikä descriptor sopii tähän?

Kertaus

Mukautetut serialisoijat käsittelevät tyyppejä, joita liitännäinen ei tunne:

  • Toteuttakaa KSerializer<T> ja sen descriptor-, serialize- ja deserialize-jäsenet
  • Käyttäkää niitä @Serializable(with=)-, @UseSerializers- tai @Contextual-annotaation ja moduulin avulla
  • Sovittakaa descriptorin tyyppi enkoodauksessa käytettävään muotoon

Tämä päättää Serialization-kurssin.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Mukautetut serialisoijat” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Mukautetut serialisoijat”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Mukautetut serialisoijat”?

Käsittele erikoistyyppejä Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Mukautetut serialisoijat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. kotlinx.serializationin käyttöönotto
  2. Serializable-luokat
  3. JSON-koodaus ja -dekoodaus
  4. Mukautetut serialisoijat
← Takaisin: Kotlin Academy