Sobes.tech
Middle

Millised mehhanismid kasutatakse andmete serialiseerimiseks Kotlinis?

sobes.tech AI

Vastus AI-lt

Kotlinis datu serializēšanai tiek izmantoti šādi galvenie mehānismi:

  1. kotlinx.serialization bibliotēka:

    • Oficiāla platformu neierobežojoša bibliotēka no JetBrains.
    • Palaiko dažādus formātus: JSON, Protobuf, CBOR, YAML.
    • Balstīta uz anotācijām un kompilatora paplašinājumu, kas ļauj ģenerēt serializācijas kodu kompilācijas laikā.
    • Nodrošina automātisku datu klases serializāciju.

    Piemērs lietošanai:

    import kotlinx.serialization.Serializable
    import kotlinx.serialization.json.Json
    
    @Serializable
    datu klase User(val name: String, val age: Int)
    
    fun main() {
        val user = User("Alice", 30)
        val jsonString = Json.encodeToString(User.serializer(), user) // Serializācija uz JSON
        println(jsonString)
        val decodedUser = Json.decodeFromString(User.serializer(), jsonString) // Deserializācija no JSON
        println(decodedUser)
    }
    
  2. Jackson:

    • Ļoti populāra Java bibliotēka, plaši izmantota ar Kotlin.
    • Prasa pievienot jackson-module-kotlin moduli, lai atbalstītu Kotlin specifiskas konstrukcijas (piemēram, datu klases ar noklusējuma konstruktoru parametriem).
    • Atbalsta daudzus formātus: JSON, XML, YAML un citus.
    • Darbojas, balstoties uz refleksiju.

    Piemērs lietošanai ar Kotlin moduli:

    import com.fasterxml.jackson.annotation.JsonProperty
    import com.fasterxml.jackson.databind.ObjectMapper
    import com.fasterxml.jackson.module.kotlin.KotlinModule
    import com.fasterxml.jackson.module.kotlin.readValue
    
    datu klase Product(
        @JsonProperty("id") val id: Int,
        @JsonProperty("name") val name: String,
        @JsonProperty("price") val price: Double
    )
    
    fun main() {
        val mapper = ObjectMapper().registerModule(KotlinModule())
        val product = Product(1, "Laptop", 1200.0)
        val jsonString = mapper.writeValueAsString(product) // Serializācija uz JSON
        println(jsonString)
        val decodedProduct = mapper.readValue<Product>(jsonString) // Deserializācija no JSON
        println(decodedProduct)
    }
    
  3. Gson:

    • Google bibliotēka.
    • Tāpat populāra, īpaši Android izstrādē.
    • Darbojas, balstoties uz refleksiju.
    • Atbalsta tikai JSON.
    • Var prasīt skaidrāku tipu norādi deserializācijai kolekcijām vai ģenerikiem.

    Piemērs lietošanai:

    import com.google.gson.Gson
    import com.google.gson.annotations.SerializedName
    
    datu klase Item(
        @SerializedName("item_id") val itemId: String,
        @SerializedName("description") val description: String
    )
    
    fun main() {
        val gson = Gson()
        val item = Item("SKU123", "Wireless Mouse")
        val jsonString = gson.toJson(item) // Serializācija uz JSON
        println(jsonString)
        val decodedItem = gson.fromJson(jsonString, Item::class.java) // Deserializācija no JSON
        println(decodedItem)
    }
    
  4. Kryo:

    • Augstas veiktspējas binārās objekta serializācijas ietvars.
    • Bieži izmanto augstas veiktspējas scenārijos, piemēram, kešatmiņā vai tīkla komunikācijā, kur svarīgs ir izmērs un ātrums.
    • Gali prasīt klases reģistrāciju.

    Piemērs (konceptuāls, ne pilns kods ar konfigurāciju):

    // Piemērs balstīts uz Kryo koncepciju
    import com.esotericsoftware.kryo.Kryo
    import com.esotericsoftware.kryo.io.Input
    import com.esotericsoftware.kryo.io.Output
    import java.io.FileInputStream
    import java.io.FileOutputStream
    
    datu klase Event(val id: Int, val timestamp: Long, val message: String)
    
    fun main() {
        val kryo = Kryo()
        kryo.register(Event::class.java) // Reģistrēt klasi
    
        val event = Event(42, System.currentTimeMillis(), "Something happened!")
    
        // Sērijveidošana uz failu
        Output(FileOutputStream("event.bin")).use { output ->
            kryo.writeObject(output, event)
        }
    
        // Desērijveidošana no faila
        Input(FileInputStream("event.bin")).use { input ->
            val decodedEvent = kryo.readObject(input, Event::class.java)
            println(decodedEvent)
        }
    }
    

Izvēle ir atkarīga no projekta prasībām: platformu saderība, datu formāts, veiktspēja, bibliotēku izmērs un lietošanas ērtums. kotlinx.serialization ir ieteicamā izvēle jauniem Kotlin projektiem, īpaši platformu neierobežotiem. Jackson un Gson joprojām ir populāri, īpaši ar esošajām Java ekosistēmām. Kryo tiek izmantots specifiskās, veiktspējīgas uzdevumos.