Mukautetut serialisoijat
Käsittele erikoistyyppejä
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.EncoderLocalDate-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.
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
- kotlinx.serializationin käyttöönotto
- Serializable-luokat
- JSON-koodaus ja -dekoodaus
- Mukautetut serialisoijat