Skip to content

シリアライズ

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

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.3.0"
        kotlin("plugin.serialization") version "2.3.0"
    }
    groovy
    plugins {
        id 'org.jetbrains.kotlin.jvm' version '2.3.0'
        id 'org.jetbrains.kotlin.plugin.serialization' version '2.3.0'  
    }
  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)
  2. 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"}

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

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

  3. JSON からオブジェクトをデシリアライズするには、decodeFromString() 関数を使用します。

    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 Guide を参照してください。

以下のリソースで Kotlin シリアライズのさまざまな側面を調べることができます: