原典:Kotlin/kotlinx.serialization
#Kotlinマルチフラットフォーム/マルチフォーマット リフレクションレス シリアライゼーション
Kotlinのシリアライズは、シリアライズ可能なクラスのビジタコードを生成するコンパイラプラグイン、コアシリアライズAPIを持つランタイムライブラリ、様々なシリアライズフォーマットを持つサポートライブラリで構成されています。
-
@Serializable
とマークされたKotlinクラスと標準コレクションをサポートします。 - JSON、 Protobuf、 CBOR,、Hocon そして Properties フォーマットを提供します。
- 完全なマルチプラットフォーム(JVM、JS、ネイティブ)に対応。
目次
- イントロダクションとリファレンス
-
セットアップ
-
Gradle
-
plugins
ブロックを使う -
apply plugin
を使う(従来のやり方) - JSONライブラリへの依存性
-
- Android
- マルチプラットフォーム (Common, JS, Native)
- Maven
-
Gradle
##イントロダクションとリファレンス
ちょっとした例をご紹介します。
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class Project(val name: String, val language: String)
fun main() {
// Serializing objects
val data = Project("kotlinx.serialization", "Kotlin")
val string = Json.encodeToString(data)
println(string) // {"name":"kotlinx.serialization","language":"Kotlin"}
// Deserializing back into objects
val obj = Json.decodeFromString<Project>(string)
println(obj) // Project(name=kotlinx.serialization, language=Kotlin)
}
完全なコードはこちらから取得できます。
**詳細は [Kotlin Serialization Guide] (https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serialization-guide.md) を参照してください。(非公認翻訳版はこちら)。
GitHub Pagesに自動生成されたドキュメントサイトがあります。
セットアップ
Kotlin SerializationプラグインはKotlinコンパイラのディストリビューションに同梱されており、IDEAプラグインはKotlinプラグインにバンドルされています。Kotlin Serializationを使用するには、Kotlinコンパイラ 1.4.0
以降が必要です。IDEに対応するKotlinプラグインがインストールされていることを確認してください。
Gradle
####plugins
ブロックを使う
シリアル化プラグインをKotlinプラグインで設定するには、以下のようにします。
Gradle plugins DSL:
Kotlin DSL:
plugins {
kotlin("jvm") version "1.4.10" // or kotlin("multiplatform") or any other kotlin plugin
kotlin("plugin.serialization") version "1.4.10"
}
Groovy DSL:
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.4.10'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.4.10'
}
1.4.0以前のKotlinのバージョンは、Kotlinシリアライズの安定版リリースではサポートされていません。
apply plugin
を使う (従来の方法)
まず、他のcompiler pluginsと同様に、シリアライズプラグインをクラスパスに追加する必要があります。
Kotlin DSL:
buildscript {
repositories { jcenter() }
dependencies {
val kotlinVersion = "1.4.10"
classpath(kotlin("gradle-plugin", version = kotlinVersion))
classpath(kotlin("serialization", version = kotlinVersion))
}
}
Groovy DSL:
buildscript {
ext.kotlin_version = '1.4.10'
repositories { jcenter() }
dependencies {
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
}
}
そして、apply plugin
(example in Groovy) を実行する。
apply plugin: 'kotlin' // or 'kotlin-multiplatform' for multiplatform projects
apply plugin: 'kotlinx-serialization'
JSONライブラリへの依存性
プラグインの設定を行った後、シリアライズライブラリに依存関係を追加する必要があります。プラグインのバージョンはコンパイラのバージョンと同じですが、ランタイムライブラリはコーディネート、リポジトリ、バージョン管理が異なるので注意してください。
Kotlin DSL:
repositories {
// Artifacts are also available on Maven Central
jcenter()
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1")
}
Groovy DSL:
repositories {
// Artifacts are also available on Maven Central
jcenter()
}
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1"
}
また、
kotlinx-serialization-core
は、すべてのシリアライズ API を含んでいますが、 バンドルされたシリアライズフォーマットは持っていません。
Android
ライブラリはAndroid上で "そのまま "動作するはずです。proguardを使っている場合は、これを proguard-rules.pro
に追加する必要があります。
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations
# kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer
-keepclassmembers class kotlinx.serialization.json.** {
*** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
kotlinx.serialization.KSerializer serializer(...);
}
# Change here com.yourcompany.yourpackage
-keep,includedescriptorclasses class com.yourcompany.yourpackage.**$$serializer { *; } # <-- change package name to your app's
-keepclassmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's
*** Companion;
}
-keepclasseswithmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's
kotlinx.serialization.KSerializer serializer(...);
}
また、定義したすべてのカスタムシリアライザを保持しておくとよいでしょう。
マルチプラットフォーム(Common, JS, Native)
ほとんどのモジュールはKotlin/JSやKotlin/Nativeでも利用可能です。必要なモジュールに依存関係を追加することができます。
commonMain {
dependencies {
// Works as common dependency as well as the platform one
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization_version"
}
}
同じアーティファクト座標( artifact coordinates)は、プラットフォーム固有のソースセットにおいて、プラットフォーム固有のアーティファクトに依存して使用することができます。(The same artifact coordinates can be used to depend on platform-specific artifact in platform-specific source-set.)
Maven
Kotlinのバージョンとシリアライズのバージョンが適切であることを確認してください。
<properties>
<kotlin.version>1.4.10</kotlin.version>
<serialization.version>1.0.1</serialization.version>
</properties>
JCenterやhttps://kotlin.bintray.com/kotlinx
Bintrayリポジトリを利用することもできます。
Kotlinコンパイラプラグインにシリアライズプラグインを追加する。
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<compilerPlugins>
<plugin>kotlinx-serialization</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-serialization</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
シリアライズ ランタイム ライブラリへの依存関係を追加しました。
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-serialization-json</artifactId>
<version>${serialization.version}</version>
</dependency>