概要
シリアライゼーション(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変換 |
参考リンク