0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】Kotlin シリアライゼーション徹底解説

Posted at

概要

シリアライゼーション(Serialization) とは、
オブジェクト(クラスのインスタンスなど)の状態を
保存や転送が可能な形式(バイト列・JSONなど) に変換する技術のことです。

そしてその逆、データからオブジェクトを復元することを
デシリアライゼーション(Deserialization) と呼びます。


シリアライゼーションの目的

用途 説明
永続化 オブジェクトをファイルやDBに保存する
通信 ネットワーク経由でオブジェクトを送受信
キャッシュ メモリやストレージに一時保存し、再利用
プロセス間通信 異なるアプリ・システム間でデータ共有

イメージ図


Kotlinでの実装方法

方法①:Serializable(Java方式)

Javaのシリアライズ仕組みをそのまま利用します。
簡単ですが、Kotlin Multiplatformには非対応 であり、
セキュリティリスク も指摘されています。

import java.io.*

data class User(val name: String, val age: Int) : Serializable

fun main() {
    val user = User("Anna", 25)

    // シリアライズ(保存)
    ObjectOutputStream(FileOutputStream("user.dat")).use {
        it.writeObject(user)
    }

    // デシリアライズ(復元)
    val restored = ObjectInputStream(FileInputStream("user.dat")).use {
        it.readObject() as User
    }

    println(restored) // User(name=Anna, age=25)
}

方法②:kotlinx.serialization(公式推奨)

Kotlin公式の マルチプラットフォーム対応 ライブラリです。
JSON・ProtoBuf・CBOR・HOCON など多くの形式をサポートします。

import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class User(val name: String, val age: Int)

fun main() {
    val user = User("Anna", 25)

    // JSONに変換(シリアライズ)
    val jsonString = Json.encodeToString(user)
    println(jsonString) // {"name":"Anna","age":25}

    // JSONから復元(デシリアライズ)
    val restored = Json.decodeFromString<User>(jsonString)
    println(restored) // User(name=Anna, age=25)
}

フォーマット比較

フォーマット 特徴
JSON 可読性が高く、Web APIで広く利用
XML 古くからの標準形式、タグ構造が明確
ProtoBuf Google製バイナリ形式、高速・軽量
MessagePack IoT向けの軽量バイナリ形式
Java Binary Java独自形式、互換性に制約あり

注意点

注意点 説明
クラス構造変更 過去データが復元できないことがある
セキュリティ 不正データでの攻撃リスク(特にSerializable
パフォーマンス JSONなどテキスト形式は速度・サイズ面で劣る場合も

Clean Architectureとの関係

Clean Architecture では、
シリアライゼーションは Data層 に属する責務 です。

役割 シリアライゼーションの関係
Domain層 ビジネスロジック 影響を受けないようにする(独立)
Data層 データ取得・変換 JSON ⇄ DTO ⇄ Domain モデルの変換を担当
Infrastructure層 外部IO実装 実際のファイル・ネットワーク通信を担当

構造例

data/
 ├─ dto/
 │   └─ UserDto.kt
 ├─ repository/
 │   └─ UserRepositoryImpl.kt
 └─ mapper/
     └─ UserMapper.kt
UserDto.kt
@Serializable
data class UserDto(val name: String, val age: Int)
UserMapper.kt
fun UserDto.toDomain(): User = User(name, age)
fun User.toDto(): UserDto = UserDto(name, age)
UserRepositoryImpl.kt
class UserRepositoryImpl(private val api: UserApi) : UserRepository {
    override suspend fun fetchUser(): User {
        val dto = api.getUser() // JSON取得
        return dto.toDomain()   // Domainモデルに変換
    }
}

実務での選択ガイド

シーン 推奨方法
単純なJVMアプリ Serializable
Android / Kotlin Multiplatform kotlinx.serialization
高速・軽量が必要 ProtoBuf or MessagePack
REST API連携 Json.encodeToString / decodeFromString

まとめ

項目 内容
意味 オブジェクトを保存・転送できる形式に変換する技術
逆操作 デシリアライゼーション
用途 永続化、通信、キャッシュなど
Kotlin公式推奨 kotlinx.serialization
Clean Architectureでの位置 Data層でのDTO変換

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?