Middle
Koji se mehanizmi koriste za serijalizaciju podataka u Kotlinu?
sobes.tech АИ
Одговор од АИ
У Kotlin-u, следећи основни механизми се користе за серијализацију података:
-
Библиотека kotlinx.serialization:
- Званична кросплатформска библиотека од JetBrains.
- Подржава различите формате: JSON, Protobuf, CBOR, YAML.
- Основана на анотацијама и плагину за компилатор, што омогућава генерисање кода за серијализацију током компилације.
- Омогућава аутоматску серијализацију класа података.
Пример употребе:
import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @Serializable data class User(val name: String, val age: Int) fun main() { val user = User("Alice", 30) val jsonString = Json.encodeToString(User.serializer(), user) // Серијализација у JSON println(jsonString) val decodedUser = Json.decodeFromString(User.serializer(), jsonString) // Десеријализација из JSON println(decodedUser) } -
Jackson:
- Веома популарна Java-библиотека, широко коришћена са Kotlin-ом.
- Захтева додавање модула
jackson-module-kotlinза подршку за Kotlin-специфичне конструкције (нпр. серијализација класа података са подразумеваним параметрима конструктора). - Подржава више формата: JSON, XML, YAML и друге.
- Ради на основу рефлексије.
Пример употребе са Kotlin модулом:
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 data class 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) // Серијализација у JSON println(jsonString) val decodedProduct = mapper.readValue<Product>(jsonString) // Десеријализација из JSON println(decodedProduct) } -
Gson:
- Библиотека од Google.
- Такође популарна, посебно у Android развоју.
- Ради на основу рефлексије.
- Подржава само JSON.
- Може захтевати јасније указивање типова за десеријализацију колекција или генерика.
Пример употребе:
import com.google.gson.Gson import com.google.gson.annotations.SerializedName data class 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) // Серијализација у JSON println(jsonString) val decodedItem = gson.fromJson(jsonString, Item::class.java) // Десеријализација из JSON println(decodedItem) } -
Kryo:
- Производна рамка за бинарну серијализацију објеката.
- Често се користи за високопроизводне сценарије, као што су кеширање или мрежна комуникација, где је важан размер и брзина серијализације.
- Може захтевати регистрацију класа.
Пример (концептуалан, не потпун код са подешавањем):
// Пример на основу концепције Kryo 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 data class Event(val id: Int, val timestamp: Long, val message: String) fun main() { val kryo = Kryo() kryo.register(Event::class.java) // Регистрација класе val event = Event(42, System.currentTimeMillis(), "Нешто се догодило!") // Серијализација у фајл Output(FileOutputStream("event.bin")).use { output -> kryo.writeObject(output, event) } // Десеријализација из фајла Input(FileInputStream("event.bin")).use { input -> val decodedEvent = kryo.readObject(input, Event::class.java) println(decodedEvent) } }
Избор механизма зависи од захтева пројекта: кросплатформеност, формат података, перформансе, величина библиотека и погодност за коришћење. kotlinx.serialization је препоручени избор за нове Kotlin пројекте, посебно кросплатформске. Jackson и Gson остају популарни, посебно при интеграцији са постојећим Java екосистемима. Kryo се користи у специфичним, високопроизводним задацима.