网站首页 > 开源技术 正文
序列化和反序列化是软件开发中的基本过程,特别是用于持久化对象、通过网络传输数据和保存应用程序状态。在 Kotlin 中,有多种库和技术可以高效地处理序列化和反序列化。
关键概念
- 序列化:将对象转换为易于存储或传输的格式的过程(例如 JSON、XML、二进制)。
- 反序列化:将序列化格式转换回对象的过程。
Kotlin 中常见的序列化/反序列化库
- Kotlin Serialization:Kotlin 的原生序列化库。
- Gson:Google 提供的流行 JSON 序列化/反序列化库。
- Moshi:Square 提供的现代 JSON 库,用于 Android 和 Java。
- Jackson:Java 的高性能 JSON 处理器。
- Protobuf:协议缓冲区,一种二进制序列化格式。
Kotlin Serialization
Kotlin Serialization 是 JetBrains 开发的 Kotlin 库,提供了一种原生的方式来序列化和反序列化 Kotlin 对象。它与 Kotlin 的语言特性集成良好,并提供了出色的性能和易用性。
添加 Kotlin Serialization
在build.gradle 中添加必要的依赖:
plugins {
kotlin("plugin.serialization") version "1.5.31"
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
}
示例用法
定义一个数据类并用 @Serializable 注解:
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class User(val name: String, val age: Int, val email: String)
fun main() {
val user = User("John Doe", 30, "john.doe@example.com")
// 序列化为 JSON
val jsonString = Json.encodeToString(user)
println(jsonString) // {"name":"John Doe","age":30,"email":"john.doe@example.com"}
// 反序列化为对象
val deserializedUser = Json.decodeFromString<User>(jsonString)
println(deserializedUser) // User(name=John Doe, age=30, email=john.doe@example.com)
}
Gson
Gson 是一个 Java 库,用于将 Java 对象转换为 JSON 表示,并将 JSON 表示转换回对象。它使用简单,并且与 Kotlin 集成良好。
添加 Gson
在 build.gradle 中添加 Gson 依赖:
dependencies {
implementation("com.google.code.gson:gson:2.8.8")
}
示例用法
定义一个数据类:
data class User(val name: String, val age: Int, val email: String)
fun main() {
val gson = Gson()
val user = User("John Doe", 30, "john.doe@example.com")
// 序列化为 JSON
val jsonString = gson.toJson(user)
println(jsonString) // {"name":"John Doe","age":30,"email":"john.doe@example.com"}
// 反序列化为对象
val deserializedUser = gson.fromJson(jsonString, User::class.java)
println(deserializedUser) // User(name=John Doe, age=30, email=john.doe@example.com)
}
Moshi
Moshi 是 Square 提供的一个用于 Android 和 Java 的 JSON 库,以其易用性和对 Kotlin 的支持而闻名。
添加 Moshi
在 build.gradle 中添加 Moshi 依赖:
dependencies {
implementation("com.squareup.moshi:moshi:1.14.0")
implementation("com.squareup.moshi:moshi-kotlin:1.14.0")
}
示例用法
定义一个数据类:
import com.squareup.moshi.*
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
data class User(val name: String, val age: Int, val email: String)
fun main() {
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
val jsonAdapter = moshi.adapter(User::class.java)
val user = User("John Doe", 30, "john.doe@example.com")
// 序列化为 JSON
val jsonString = jsonAdapter.toJson(user)
println(jsonString) // {"name":"John Doe","age":30,"email":"john.doe@example.com"}
// 反序列化为对象
val deserializedUser = jsonAdapter.fromJson(jsonString)
println(deserializedUser) // User(name=John Doe, age=30, email=john.doe@example.com)
}
Jackson
Jackson 是一个广泛使用的 JSON 库,以其高性能闻名。
添加 Jackson
在 build.gradle 中添加 Jackson 依赖:
dependencies {
implementation("com.fasterxml.jackson.core:jackson-databind:2.12.3")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.12.3")
}
示例用法
定义一个数据类:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.readValue
data class User(val name: String, val age: Int, val email: String)
fun main() {
val objectMapper = ObjectMapper().registerModule(KotlinModule())
val user = User("John Doe", 30, "john.doe@example.com")
// 序列化为 JSON
val jsonString = objectMapper.writeValueAsString(user)
println(jsonString) // {"name":"John Doe","age":30,"email":"john.doe@example.com"}
// 反序列化为对象
val deserializedUser: User = objectMapper.readValue(jsonString)
println(deserializedUser) // User(name=John Doe, age=30, email=john.doe@example.com)
}
Protobuf
协议缓冲区(Protobuf)是 Google 开发的一种二进制序列化格式。它比 JSON 在大小和速度上都更加高效,但需要一个模式定义。
添加 Protobuf
在 build.gradle 中添加 Protobuf 依赖:
plugins {
id 'com.google.protobuf' version '0.8.17'
}
dependencies {
implementation "com.google.protobuf:protobuf-java:3.17.3"
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.17.3'
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
}
}
}
示例用法
定义一个 .proto 文件来定义你的模式:
syntax = "proto3";
message User {
string name = 1;
int32 age = 2;
string email = 3;
}
使用 Protobuf 插件生成 Java 类,然后在你的 Kotlin 代码中使用它们:
import com.example.UserOuterClass.User
fun main() {
val user = User.newBuilder()
.setName("John Doe")
.setAge(30)
.setEmail("john.doe@example.com")
.build()
// 序列化为二进制
val byteArray = user.toByteArray()
// 反序列化为对象
val deserializedUser = User.parseFrom(byteArray)
println(deserializedUser) // name: "John Doe" age: 30 email: "john.doe@example.com"
}
通过以上示例,可以在不同的序列化和反序列化库之间做出选择,根据你的需求选择最适合的解决方案。
猜你喜欢
- 2024-09-30 设计模式学习笔记:原型模式以及深浅拷贝的区别
- 2024-09-30 金三银四涨薪计划Java不懂这些核心技能,还想去大厂?
- 2024-09-30 我赌你不懂系列:序列化是什么(序列化的概念)
- 2024-09-30 使用MVP+RxJava+Retrofit框架(mvp retrofit rxjava)
- 2024-09-30 Java开发必须要掌握的20个核心技术,你掌握了多少?
- 2024-09-30 114、mvc各部分;反射一般场景(反射setaccessible)
- 2024-09-27 # Kafka_深入探秘者(8):kafka 高级应用--2
- 2024-09-27 # Kafka_深入探秘者(8):kafka 高级应用--1
- 2024-09-27 为什么强烈禁止开发人员使用isSuccess作为变量名
- 2024-09-27 重新认识一个强大的 Gson,从一个线上 BUG 说起
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)