Type to search…

Serialitzadors

La funció d'un serialitzador es determinar com es descomposa un objecte en les seves propietats constituents.

This page hasn't been translated yet — shown in its original language:Català

Introducció

Cada format de codificació representa un objecte d’una manera específic: XML i JSON poden representar el mateix objecte, però ho fan de manera diferent.

La funció d’un serialitzador es determinar com es descomposa un objecte en les seves propietats constituents.

Fins ara hem utilitzat:

  1. Serialitzadors que es deriven de manera automàtica a partir de l’anotació @Serializable

  2. Serialitzadors que ja estan implementat per les classes bàsiques.

Per exemple, a continuació tenim una classe Color que te un propietat rgb de tipus Int per guardar el codi del color:

kotlin
@Serializable
class Color(val rgb: Int)

fun main() {
    val green = Color(0x00ff00)
    println(Json.encodeToString(green))
}  

Per defecte, aquesta classe serialitza la propietat rgb a JSON mitjnaçant:

  1. Un serialitzador derivat a partir de la classe Color
  2. Un serialitzador ja implementat per a la classe Int
json
{ "rgb": 65280 }

I ara anem ha explicar com es fa.

Serialitzador

Cada tipus concret necessita un serialitzador específic, que és un classe que implementa la interfície [KSerializer](https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-k-serializer/index.html.

.serializer()

Quan marques una classe amb l’anotació @Serializable, com has fet amb la classe Color, el plugin del compilador genera de manera automàtica una classe que implementa la interfice KSerializer amb el codi necessari per serialitzar aquesta, i només aquesta classe.

Com és lògic, el serializador quan ha de serialitzar un objecte necessita un objecte que implementi la classe que s’ha generat de manera automàtica.

Però enlloc de crear un objecte cada cop que ha de serialitzar un objecte, cosa que seria una autèntica burrada en termes de rendiment, el plugin del compilador també crea un objecte complementari de la classe que has anotat amb @Serializable.

L’objecte complementari té la funció .serializer() que retorna una única instància de la classe que implementa la interfície KSerializerque s’ha generat automàticament.

De la mateixa que el serialitzador accedeix a aquesta instància de manera automàtica, tu també pots, ja que es pot utilitzar de manera concurrent sense problemes:

kotlin
fun main() {
    val colorSerializer: KSerializer<Color> = Color.serializer()
    println(colorSerializer.descriptor)
}

La instància de tipus KSerializer té la propietat descriptor que descriu l’estrucutra de la classe serialitzada:

shell
Color(rgb: kotlin.Int)

You're reading a preview.

Sign in with Google to read the full page. A Google account includes 5 free pages in total; students and teachers read their course pages without limit.

Sign in