シリアライゼーション
シリアライゼーション とは、アプリケーションが使用するデータを、ネットワーク経由で転送したり、データベースやファイルに保存したりできる形式に変換するプロセスです。一方、デシリアライゼーション は、外部ソースからデータを読み込み、それをランタイムオブジェクトに変換する逆のプロセスです。これらは、サードパーティとデータを交換するほとんどのアプリケーションにとって不可欠なものです。
JSON や Protocol Buffers のような一部のデータシリアライゼーション形式は、特に一般的です。これらは言語に依存せず、プラットフォームにも依存しないため、任意のモダンな言語で記述されたシステム間でのデータ交換を可能にします。
Kotlinでは、データシリアライゼーションツールは独立したコンポーネントである kotlinx.serialization で利用できます。これは、org.jetbrains.kotlin.plugin.serialization
Gradleプラグイン、ランタイムライブラリ、およびコンパイラプラグインのいくつかの部分から構成されています。
コンパイラプラグインである kotlinx-serialization-compiler-plugin
と kotlinx-serialization-compiler-plugin-embeddable
は、Maven Central に直接公開されています。2番目のプラグインは、kotlin-compiler-embeddable
アーティファクトと連携するように設計されており、これはスクリプティングアーティファクトのデフォルトオプションです。Gradleは、コンパイラプラグインをコンパイラの引数としてプロジェクトに追加します。
ライブラリ
kotlinx.serialization
は、JVM、JavaScript、Native のすべてのサポートされているプラットフォーム向けに、また JSON、CBOR、Protocol Buffers など、さまざまなシリアライゼーション形式向けのライブラリセットを提供します。サポートされているシリアライゼーション形式の完全なリストは 以下 で確認できます。
すべてのKotlinシリアライゼーションライブラリは org.jetbrains.kotlinx:
グループに属しています。それらの名前は kotlinx-serialization-
で始まり、シリアライゼーション形式を反映したサフィックスを持ちます。例:
org.jetbrains.kotlinx:kotlinx-serialization-json
は、KotlinプロジェクトにJSONシリアライゼーションを提供します。org.jetbrains.kotlinx:kotlinx-serialization-cbor
は、CBORシリアライゼーションを提供します。
プラットフォーム固有のアーティファクトは自動的に処理されるため、手動で追加する必要はありません。JVM、JS、Native、およびマルチプラットフォームプロジェクトで同じ依存関係を使用してください。
kotlinx.serialization
ライブラリは独自のバージョニング構造を使用しており、Kotlinのバージョニングとは一致しないことに注意してください。最新バージョンを見つけるには、GitHub のリリースを確認してください。
形式
kotlinx.serialization
には、さまざまなシリアライゼーション形式用のライブラリが含まれています。
- JSON:
kotlinx-serialization-json
- Protocol Buffers:
kotlinx-serialization-protobuf
- CBOR:
kotlinx-serialization-cbor
- Properties:
kotlinx-serialization-properties
- HOCON:
kotlinx-serialization-hocon
(JVMのみ)
JSONシリアライゼーション (kotlinx-serialization-json
) を除くすべてのライブラリは Experimental であり、APIが予告なく変更される可能性があることに注意してください。
YAML や Apache Avro など、より多くのシリアライゼーション形式をサポートするコミュニティによってメンテナンスされているライブラリもあります。利用可能なシリアライゼーション形式に関する詳細については、kotlinx.serialization
ドキュメント を参照してください。
例: JSONシリアライゼーション
KotlinオブジェクトをJSONにシリアライズする方法を見てみましょう。
プラグインと依存関係の追加
始める前に、プロジェクトでKotlinシリアライゼーションツールを使用できるようにビルドスクリプトを設定する必要があります。
KotlinシリアライゼーションGradleプラグイン
org.jetbrains.kotlin.plugin.serialization
(または Kotlin Gradle DSL ではkotlin("plugin.serialization")
) を適用します。
plugins {
kotlin("jvm") version "2.1.21"
kotlin("plugin.serialization") version "2.1.21"
}
```
```groovy [Groovy]
plugins {
id 'org.jetbrains.kotlin.jvm' version '2.1.21'
id 'org.jetbrains.kotlin.plugin.serialization' version '2.1.21'
}
```
:::
2. JSONシリアライゼーションライブラリの依存関係 `org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1` を追加します。
::: code-group
```kotlin [Kotlin]
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1")
}
```
```groovy [Groovy]
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1'
}
```
:::
これで、コードでシリアライゼーションAPIを使用する準備が整いました。APIは `kotlinx.serialization` パッケージとその形式固有のサブパッケージ (例: `kotlinx.serialization.json`) にあります。
### JSONのシリアライズとデシリアライズ
1. `@Serializable` でアノテーションを付けて、クラスをシリアライズ可能にします。
```kotlin
import kotlinx.serialization.Serializable
@Serializable
data class Data(val a: Int, val b: String)
Json.encodeToString()
を呼び出して、このクラスのインスタンスをシリアライズします。
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString
@Serializable
data class Data(val a: Int, val b: String)
fun main() {
val json = Json.encodeToString(Data(42, "str"))
}
結果として、このオブジェクトの状態をJSON形式で含む文字列 {"a": 42, "b": "str"}
が得られます。
NOTE
オブジェクトのコレクション (リストなど) も、1回の呼び出しでシリアライズできます。
val dataList = listOf(Data(42, "str"), Data(12, "test"))
val jsonList = Json.encodeToString(dataList)
decodeFromString()
関数を使用して、JSONからオブジェクトをデシリアライズします。
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.decodeFromString
@Serializable
data class Data(val a: Int, val b: String)
fun main() {
val obj = Json.decodeFromString<Data>("""{"a":42, "b": "str"}""")
}
これで完了です!オブジェクトをJSON文字列にシリアライズし、それらをオブジェクトにデシリアライズすることに成功しました。
次のステップ
Kotlinでのシリアライゼーションに関する詳細については、Kotlin Serialization Guide を参照してください。
以下のリソースで、Kotlinシリアライゼーションのさまざまな側面を探求できます。