Kotlin Academy · レッスン

カスタムシリアライザー

特殊な型を扱います

レッスン 4/413 ステップ

「カスタムシリアライザー」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

カスタムシリアライザーを使う理由

組み込みシリアライザーのない型があります。例として、java.util.Date、LocalDate、UUID、サードパーティライブラリの型などです。

カスタムシリアライザーは、そのような型をシリアライズ形式との間でどのように変換するかを定義します。

KSerializerインターフェース

カスタムシリアライザーは KSerializer<T> を実装し、descriptor、serialize、deserialize の3つのメンバーを定義します。

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

LocalDate用のシリアライザー

LocalDate をISO文字列との間で変換します。descriptorでは、プリミティブな文字列として宣言します。

import java.time.LocalDate
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

object LocalDateSerializer : KSerializer<LocalDate> {
    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING)
    override fun serialize(encoder: Encoder, value: LocalDate) =
        encoder.encodeString(value.toString())
    override fun deserialize(decoder: Decoder): LocalDate =
        LocalDate.parse(decoder.decodeString())
}

@Serializable(with = ...)の使用

特定のプロパティに @Serializable(with = ...) を付けて、シリアライザーを適用します。

import java.time.LocalDate
import kotlinx.serialization.Serializable

@Serializable
data class Event(
    val name: String,
    @Serializable(with = LocalDateSerializer::class)
    val date: LocalDate
)

ファイルレベルの@UseSerializers

すべてのプロパティにアノテーションを付ける代わりに、@file:UseSerializers を使ってファイルごとにシリアライザーを一度だけ宣言できます。

@file:UseSerializers(LocalDateSerializer::class)

import kotlinx.serialization.UseSerializers
import java.time.LocalDate
import kotlinx.serialization.Serializable

@Serializable
data class Event(val name: String, val date: LocalDate)

コンテキストシリアル化

Json { } モジュールにシリアライザーをグローバル登録し、プロパティに @Contextual を付けます。シリアライザーは実行時にモジュールから解決されます。

import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import java.time.LocalDate

@Serializable
data class Event(val name: String, @Contextual val date: LocalDate)

SerializersModuleを登録する

型とそのシリアライザーを関連付けるモジュールを構築し、Json に渡します。

import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import java.time.LocalDate

val module = SerializersModule {
    contextual(LocalDate::class, LocalDateSerializer)
}
val json = Json { serializersModule = module }

複合シリアライザー

複数フィールドを持つ型には、プリミティブな記述子の代わりに構造化された記述子と encodeStructure / decodeStructure を使用します。

import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element

val descriptor = buildClassSerialDescriptor("Color") {
    element<Int>("r")
    element<Int>("g")
    element<Int>("b")
}

サロゲートパターン

より簡単な方法として、コンパイラーがすでにサポートしているサロゲートデータクラスをシリアライズし、実際の型との間で変換する方法があります。手動でエンコードやデコードを行うより、定型コードを減らせます。

import kotlinx.serialization.Serializable

@Serializable
private data class ColorSurrogate(val r: Int, val g: Int, val b: Int)

アプローチを選ぶ

要件に合う、最も軽量な方法を選びます:

  • @Serializable(with=) — 1つのプロパティ
  • @UseSerializers — ファイル全体
  • @Contextual + module — アプリ全体で使用し、実行時に解決
  • サロゲート — 最小限のコードで複合型に対応

プリミティブ記述子と構造化記述子

記述子は、エンコード方法と一致していなければなりません:

  • 単一の値(string/int) → PrimitiveSerialDescriptor
  • 複数のフィールド → buildClassSerialDescriptor

一致していないと、実行時にシリアライゼーションエラーが発生します。

理解度チェック

単一の LocalDate を1つのISO文字列としてシリアライズしたい場合、どの記述子が適切ですか?

まとめ

カスタムシリアライザーを使うと、プラグインが認識できない型にも対応できます:

  • KSerializer<T> を実装し、descriptor、serialize、deserializeを定義する
  • @Serializable(with=)、@UseSerializers、または @Contextual + モジュールで適用する
  • 記述子の種類をエンコード方法に合わせる

これでシリアライゼーションのコースは完了です。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「カスタムシリアライザー」レッスンは無料ですか?

はい。「カスタムシリアライザー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「カスタムシリアライザー」で何を学びますか?

特殊な型を扱います ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「カスタムシリアライザー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. kotlinx.serializationのセットアップ
  2. Serializableクラス
  3. JSONのエンコードとデコード
  4. カスタムシリアライザー
← Kotlin Academyに戻る