首页 Android 正文
  • 本文约4196字,阅读需21分钟
  • 87
  • 0

Android 上的序列化和反序列化

摘要

序列化和反序列化是软件开发中的基本过程,特别是用于持久化对象、通过网络传输数据和保存应用程序状态。在 Kotlin 中,有多种库和技术可以高效地处理序列化和反序列化。 关键概念 • 序列化:将对象转换为易于存储或传输的格式的过程(例如 JSON、XML、二进制)。 • 反序列化:将序列化格式转换回对象的过程。 Kotlin 中常见的序列化/反序列化库 • K...

序列化和反序列化是软件开发中的基本过程,特别是用于持久化对象、通过网络传输数据和保存应用程序状态。在 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")
}
Groovy

示例用法

定义一个数据类并用 @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)
}
Kotlin

Gson

Gson 是一个 Java 库,用于将 Java 对象转换为 JSON 表示,并将 JSON 表示转换回对象。它使用简单,并且与 Kotlin 集成良好。

添加 Gson

build.gradle 中添加 Gson 依赖:

dependencies {
    implementation("com.google.code.gson:gson:2.8.8")
}
Groovy

示例用法

定义一个数据类:

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)
}
Kotlin

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")
}
Groovy

示例用法

定义一个数据类:

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)
}
Kotlin

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")
}
Groovy

示例用法

定义一个数据类:

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)
}
Kotlin

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
            }
        }
    }
}
Groovy

示例用法

定义一个 .proto 文件来定义你的模式:

syntax = "proto3";

message User {
    string name = 1;
    int32 age = 2;
    string email = 3;
}
Kotlin

使用 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"
}
Kotlin

通过以上示例,可以在不同的序列化和反序列化库之间做出选择,根据你的需求选择最适合的解决方案。


扫描二维码,在手机上阅读
评论