Skip to content

シリアライゼーション

_シリアライゼーション_とは、アプリケーションが使用するデータを、ネットワーク経由で転送したり、データベースやファイルに保存したりできる形式に変換するプロセスです。一方、_デシリアライゼーション_とは、外部ソースからデータを読み込み、それをランタイムオブジェクトに変換する逆のプロセスです。これら二つは、サードパーティとデータをやり取りするほとんどのアプリケーションにとって不可欠です。

JSONprotocol buffersのようなデータシリアライゼーションフォーマットは特に一般的です。言語にとらわれず、プラットフォームにも依存しないため、あらゆるモダンな言語で書かれたシステム間でのデータ交換を可能にします。

Kotlinでは、データシリアライゼーションツールは、別のコンポーネントであるkotlinx.serializationで利用できます。これは、org.jetbrains.kotlin.plugin.serialization Gradleプラグイン、ランタイムライブラリ、およびコンパイラプラグインのいくつかの部分で構成されています。

コンパイラプラグインであるkotlinx-serialization-compiler-pluginkotlinx-serialization-compiler-plugin-embeddableは、Maven Centralに直接公開されています。後者のプラグインは、スクリプティングアーティファクトのデフォルトオプションである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)を除くすべてのライブラリはExperimentalであり、APIが予告なく変更される可能性があることに注意してください。

YAMLApache Avroなど、より多くのシリアライゼーションフォーマットをサポートするコミュニティでメンテナンスされているライブラリもあります。利用可能なシリアライゼーションフォーマットに関する詳細情報については、kotlinx.serializationのドキュメントを参照してください。

例: JSONシリアライゼーション

KotlinオブジェクトをJSONにシリアライズする方法を見てみましょう。

プラグインと依存関係の追加

開始する前に、プロジェクトでKotlinシリアライゼーションツールを使用できるようにビルドスクリプトを設定する必要があります。

  1. KotlinシリアライゼーションGradleプラグインorg.jetbrains.kotlin.plugin.serialization(またはKotlin Gradle DSLでkotlin("plugin.serialization"))を適用します。

    kotlin
    plugins {
        kotlin("jvm") version "2.2.10"
        kotlin("plugin.serialization") version "2.2.10"
    }
    groovy
    plugins {
        id 'org.jetbrains.kotlin.jvm' version '2.2.10'
        id 'org.jetbrains.kotlin.plugin.serialization' version '2.2.10'  
    }
  2. JSONシリアライゼーションライブラリの依存関係org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0を追加します。

    kotlin
    dependencies {
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
    }
    groovy
    dependencies {
        implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0'
    }

これで、コードでシリアライゼーション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)
  1. このクラスのインスタンスをJson.encodeToString()を呼び出してシリアライズします。
kotlin
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"}が得られます。

リストなどのオブジェクトコレクションも、単一の呼び出しでシリアライズできます。

kotlin
val dataList = listOf(Data(42, "str"), Data(12, "test"))
val jsonList = Json.encodeToString(dataList)

  1. decodeFromString()関数を使用して、JSONからオブジェクトをデシリアライズします。
kotlin
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 ガイドを参照してください。

次のリソースでKotlinシリアライゼーションのさまざまな側面を探求できます。