プログラミングを勉強していると、「シリアライゼーション」という言葉に出会うことがあります。
「シリアライゼーション?何それ、難しそう…」と感じた方も多いのではないでしょうか。
実は、シリアライゼーションはデータを保存したり送信したりするための基本的な技術なんです。私たちが普段使っているアプリやウェブサービスでも、裏側で当たり前のように使われています。
今回は、シリアライゼーションの基本から実用例、プログラミング言語ごとの使い方まで、初心者の方にも分かりやすく徹底解説していきますね!
シリアライゼーションとは何か?

基本的な意味
シリアライゼーション(Serialization)とは、プログラム内のデータやオブジェクトを、保存や送信ができる形式に変換することです。
日本語では「直列化」や「シリアル化」とも呼ばれます。
もっと簡単に言うと:
プログラムが使っているデータを、ファイルに保存したりネットワーク経由で送ったりできる形に変換すること
これだけです!
身近な例で理解しよう
ゲームのセーブデータを想像してみてください。
プレイ中、ゲームはこんな情報を持っています:
- プレイヤーの名前
- 現在のレベル
- 所持金
- アイテムのリスト
- 現在地
これらの情報をゲームを終了しても残しておく必要がありますよね。
このとき、メモリ上にあるデータをファイルに書き出せる形に変換します。これがシリアライゼーションです。
そして、次にゲームを起動したときにファイルからデータを読み込んで元に戻す。これをデシリアライゼーション(逆シリアライゼーション)と言います。
なぜシリアライゼーションが必要なのか
プログラムが動いている間、データはメモリ(RAM)に保存されています。
でも、メモリには問題があります:
問題1: 電源を切ると消える
プログラムを終了すると、メモリ上のデータは消えてしまいます。
問題2: 他のプログラムと共有できない
あるプログラムのメモリは、他のプログラムから直接アクセスできません。
問題3: ネットワーク経由で送れない
メモリ上のデータは、そのままではインターネット経由で送信できません。
シリアライゼーションで解決!
データを変換することで:
- ファイルに保存できる(永続化)
- 他のプログラムと共有できる(データ交換)
- ネットワーク経由で送信できる(通信)
これらが可能になるんです。
シリアライゼーションとデシリアライゼーション
シリアライゼーション(直列化)
データを保存・送信可能な形式に変換するプロセスです。
流れ:
メモリ上のオブジェクト
↓
[シリアライゼーション]
↓
バイト列・テキスト形式
↓
ファイル or ネットワーク
例:
Pythonのオブジェクト → JSON文字列
{
"name": "太郎",
"level": 15,
"items": ["剣", "盾"]
}
デシリアライゼーション(逆直列化)
保存・送信された形式から、元のデータ構造に戻すプロセスです。
流れ:
ファイル or ネットワーク
↓
バイト列・テキスト形式
↓
[デシリアライゼーション]
↓
メモリ上のオブジェクト
例:
JSON文字列 → Pythonのオブジェクト
この往復の変換によって、データの保存と復元が実現されるんですね。
重要なポイント
シリアライゼーションでは、データの構造と値を保存します。
しかし、以下は通常保存されません:
- プログラムのコード自体
- メソッド(関数)の実装
- ファイルハンドルやネットワーク接続などのリソース
つまり、「データ」は保存できるけど、「プログラムの動作」は保存できないということです。
シリアライゼーションの代表的な形式
データをどんな形式に変換するかには、いくつか選択肢があります。
JSON(JavaScript Object Notation)
最も人気のある形式です。
特徴:
- 人間が読みやすいテキスト形式
- ほぼすべてのプログラミング言語で対応
- ウェブAPIでの標準的な形式
- ファイルサイズは中程度
例:
{
"name": "田中太郎",
"age": 25,
"email": "tanaka@example.com",
"hobbies": ["読書", "音楽", "プログラミング"]
}
向いている用途:
- Web API の通信
- 設定ファイル
- 軽量なデータ交換
XML(eXtensible Markup Language)
伝統的な形式で、今でも広く使われています。
特徴:
- タグを使った構造化データ
- 厳密な検証が可能
- 人間が読めるが、やや冗長
- エンタープライズシステムで人気
例:
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>田中太郎</name>
<age>25</age>
<email>tanaka@example.com</email>
<hobbies>
<hobby>読書</hobby>
<hobby>音楽</hobby>
<hobby>プログラミング</hobby>
</hobbies>
</user>
向いている用途:
- 企業システム
- 設定ファイル
- データの厳密な検証が必要な場面
YAML(YAML Ain’t Markup Language)
設定ファイルでよく使われる形式です。
特徴:
- 最も読みやすい
- インデント(字下げ)で構造を表現
- コメントが書ける
- JSONよりシンプル
例:
name: 田中太郎
age: 25
email: tanaka@example.com
hobbies:
- 読書
- 音楽
- プログラミング
向いている用途:
- 設定ファイル(Docker、Kubernetes など)
- CI/CD の定義ファイル
- 人間が手で書き換える可能性がある場合
バイナリ形式(Pickle、MessagePack、Protocol Buffers など)
コンピュータが直接読み書きする形式です。
特徴:
- 人間には読めない
- ファイルサイズが小さい
- 処理速度が速い
- プログラミング言語固有のものが多い
例(Pythonのpickle):
\x80\x04\x95\x1f\x00\x00\x00...(バイナリデータ)
向いている用途:
- 高速なデータ処理が必要な場合
- 大量のデータを扱う場合
- 内部的なデータ保存
どの形式を選ぶべき?
JSON を選ぶ場合:
- Web API を作る
- 他の言語やシステムと連携する
- 人間が読む必要がある
XML を選ぶ場合:
- 既存システムがXMLを使っている
- データの検証が重要
- 企業システムとの連携
YAML を選ぶ場合:
- 設定ファイルを作る
- 読みやすさを最優先したい
- コメントを書きたい
バイナリ形式を選ぶ場合:
- 速度が重要
- ファイルサイズを小さくしたい
- 同じプログラミング言語内でのみ使う
プログラミング言語別のシリアライゼーション
各言語での実装方法を見ていきましょう。
Python でのシリアライゼーション
Pythonには複数の方法があります。
方法1: JSON を使う
最も一般的な方法です。
import json
# シリアライゼーション
data = {
"name": "田中太郎",
"age": 25,
"skills": ["Python", "JavaScript"]
}
# オブジェクトをJSON文字列に変換
json_string = json.dumps(data, ensure_ascii=False)
print(json_string)
# ファイルに保存
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# デシリアライゼーション
# JSON文字列からオブジェクトに復元
restored_data = json.loads(json_string)
print(restored_data)
# ファイルから読み込み
with open("data.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
方法2: pickle を使う(Python専用)
Pythonオブジェクトをそのまま保存できます。
import pickle
# カスタムクラスの例
class Player:
def __init__(self, name, level):
self.name = name
self.level = level
player = Player("勇者", 15)
# シリアライゼーション
with open("player.pkl", "wb") as f:
pickle.dump(player, f)
# デシリアライゼーション
with open("player.pkl", "rb") as f:
loaded_player = pickle.load(f)
print(f"{loaded_player.name}: レベル{loaded_player.level}")
注意: pickleは信頼できないデータには使わないでください。セキュリティリスクがあります。
JavaScript でのシリアライゼーション
JavaScriptはJSONとの相性が抜群です。
基本的な使い方:
// シリアライゼーション
const data = {
name: "田中太郎",
age: 25,
skills: ["JavaScript", "React"]
};
// オブジェクトをJSON文字列に変換
const jsonString = JSON.stringify(data);
console.log(jsonString);
// 読みやすく整形
const prettyJson = JSON.stringify(data, null, 2);
console.log(prettyJson);
// デシリアライゼーション
const restored = JSON.parse(jsonString);
console.log(restored.name);
ローカルストレージへの保存:
// ブラウザのlocalStorageに保存
localStorage.setItem("userData", JSON.stringify(data));
// 読み込み
const loaded = JSON.parse(localStorage.getItem("userData"));
Java でのシリアライゼーション
Javaには標準のシリアライゼーション機能があります。
基本的な使い方:
import java.io.*;
// Serializableインターフェースを実装
class Player implements Serializable {
private String name;
private int level;
public Player(String name, int level) {
this.name = name;
this.level = level;
}
}
public class SerializationExample {
public static void main(String[] args) {
Player player = new Player("勇者", 15);
// シリアライゼーション
try (ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("player.ser"))) {
out.writeObject(player);
} catch (IOException e) {
e.printStackTrace();
}
// デシリアライゼーション
try (ObjectInputStream in = new ObjectInputStream(
new FileInputStream("player.ser"))) {
Player loaded = (Player) in.readObject();
System.out.println(loaded.name + ": レベル" + loaded.level);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
JSONを使う方法(Gsonライブラリ):
import com.google.gson.Gson;
class User {
String name;
int age;
}
public class JsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
User user = new User();
user.name = "田中太郎";
user.age = 25;
// シリアライゼーション
String json = gson.toJson(user);
System.out.println(json);
// デシリアライゼーション
User loaded = gson.fromJson(json, User.class);
}
}
C# でのシリアライゼーション
C#にも複数の方法があります。
JSON を使う方法:
using System.Text.Json;
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var user = new User { Name = "田中太郎", Age = 25 };
// シリアライゼーション
string json = JsonSerializer.Serialize(user);
Console.WriteLine(json);
// デシリアライゼーション
User loaded = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(loaded.Name);
}
}
PHP でのシリアライゼーション
PHPにも標準機能があります。
serialize/unserialize:
<?php
class User {
public $name;
public $age;
}
$user = new User();
$user->name = "田中太郎";
$user->age = 25;
// シリアライゼーション
$serialized = serialize($user);
echo $serialized;
// デシリアライゼーション
$loaded = unserialize($serialized);
echo $loaded->name;
// JSONを使う方法
$json = json_encode($user);
echo $json;
$restored = json_decode($json);
echo $restored->name;
?>
シリアライゼーションの実用例

実際にどんな場面で使われているか見てみましょう。
例1: ゲームのセーブデータ
プレイヤーの進行状況を保存します。
保存する情報:
- キャラクターのステータス
- 所持アイテム
- クリア状況
- 設定項目
これらをJSONやバイナリ形式で保存し、次回起動時に復元します。
例2: Webアプリケーションの認証トークン
ログイン情報をクライアント側に保存します。
仕組み:
- サーバーがユーザー情報をシリアライゼーション
- トークンとして発行
- クライアント(ブラウザ)が保存
- 次回アクセス時に送信
- サーバーがデシリアライゼーションして認証
JWTトークンなどがこの方式です。
例3: REST APIの通信
クライアントとサーバー間でデータをやり取りします。
流れ:
- クライアントがリクエストデータをJSONにシリアライゼーション
- HTTP経由でサーバーに送信
- サーバーがデシリアライゼーションして処理
- レスポンスデータをJSONにシリアライゼーション
- クライアントに返送
- クライアントがデシリアライゼーション
Web APIの標準的なパターンですね。
例4: キャッシュシステム
データベースへのアクセスを減らすために使われます。
仕組み:
- データベースから取得したデータをシリアライゼーション
- Redisなどのキャッシュサーバーに保存
- 次回アクセス時はキャッシュから取得
- デシリアライゼーションして使用
高速化とサーバー負荷軽減に役立ちます。
例5: メッセージキューシステム
複数のシステム間でメッセージを交換します。
仕組み:
- システムAがメッセージをシリアライゼーション
- メッセージキュー(RabbitMQ、Kafkaなど)に送信
- システムBが受信
- デシリアライゼーションして処理
非同期処理の基盤技術です。
シリアライゼーションの注意点とベストプラクティス
安全かつ効率的に使うためのポイントです。
セキュリティ上の注意点
危険1: 信頼できないデータのデシリアライゼーション
外部から受け取ったシリアライゼーションデータを安易にデシリアライゼーションするのは危険です。
理由:
- 悪意のあるコードが実行される可能性
- システムが乗っ取られるリスク
- データの改ざん
対策:
- 信頼できる送信元からのデータのみ受け入れる
- 署名や暗号化を使用する
- JSONなど安全な形式を使う(pickleなどは避ける)
- 入力検証を徹底する
危険2: 機密情報の保存
シリアライゼーションしたファイルに機密情報を含めない。
理由:
- ファイルが盗まれる可能性
- プレーンテキストで読める場合がある
対策:
- パスワードは必ずハッシュ化
- 暗号化してから保存
- アクセス権限を適切に設定
パフォーマンスの最適化
ポイント1: 適切な形式を選ぶ
- 速度重視 → バイナリ形式
- 互換性重視 → JSON
- 設定ファイル → YAML
ポイント2: 必要なデータだけをシリアライゼーション
不要なデータまで含めると:
- ファイルサイズが大きくなる
- 処理時間が長くなる
- 通信コストが増える
フィールドを選択的にシリアライゼーションしましょう。
ポイント3: バージョン管理
データ構造が変わっても互換性を保つ工夫が必要です。
# バージョン情報を含める例
data = {
"version": "1.0",
"user": {
"name": "田中",
"age": 25
}
}
デシリアライゼーション時にバージョンをチェックして、適切に処理します。
互換性の確保
問題: プログラムのバージョンアップ
データ構造が変わると、古いシリアライゼーションデータが読めなくなることがあります。
解決策:
- 後方互換性を保つ
- 新しいフィールドはオプショナルに
- 古いフィールドは一定期間残す
- マイグレーション機能
- 古い形式を検出
- 新しい形式に変換
- バージョン情報の埋め込み
- データに常にバージョン番号を含める
- バージョンに応じた処理分岐
エラーハンドリング
シリアライゼーション・デシリアライゼーションは失敗する可能性があります。
よくあるエラー:
- ファイルが見つからない
- データ形式が不正
- ディスク容量不足
- ネットワークエラー
対策:
import json
try:
with open("data.json", "r") as f:
data = json.load(f)
except FileNotFoundError:
print("ファイルが見つかりません")
data = {} # デフォルト値を使用
except json.JSONDecodeError:
print("JSONの形式が不正です")
data = {}
except Exception as e:
print(f"予期しないエラー: {e}")
data = {}
エラー時の処理を必ず用意しましょう。
よくある質問と回答
Q1: シリアライゼーションとマーシャリングの違いは?
A: ほぼ同じ意味です。
- シリアライゼーション: より一般的な用語
- マーシャリング: システム間でのデータ変換に使われることが多い
細かい違いはありますが、基本的には同じ概念を指します。
Q2: すべてのオブジェクトがシリアライゼーション可能?
A: いいえ、できないものもあります。
シリアライゼーション不可能な例:
- ファイルハンドル
- ネットワーク接続
- スレッドオブジェクト
- データベース接続
これらは「状態」ではなく「リソース」だからです。
Q3: JSONとXML、どちらが速い?
A: 一般的にJSONの方が速いです。
理由:
- JSONの方が構文がシンプル
- パース(解析)処理が軽い
- データサイズが小さい傾向
ただし、用途によってはXMLが適している場合もあります。
Q4: バイナリ形式の方が常に速い?
A: 多くの場合は速いですが、常にではありません。
速い理由:
- データサイズが小さい
- パース処理が不要
デメリット:
- 実装が複雑
- デバッグしにくい
- 言語間の互換性が低い
用途に応じて選択しましょう。
Q5: シリアライゼーションでメモリは増える?
A: シリアライゼーション時は一時的に増えます。
元のオブジェクトと、変換後のデータが両方メモリに存在するためです。
大量のデータを扱う場合は、ストリーミング処理を検討しましょう。
Q6: 循環参照はどうなる?
A: 形式によって扱いが異なります。
例: オブジェクトAがBを参照し、BがAを参照する場合
- JSON: エラーになる(対応していない)
- pickle: 正しく処理できる
- 専用ライブラリ: 対応しているものもある
循環参照がある場合は、構造を見直すか対応した形式を選びましょう。
Q7: 日本語などのマルチバイト文字は大丈夫?
A: 現代的な実装なら問題ありません。
注意点:
- エンコーディング(UTF-8推奨)を明示する
- 古いシステムとの連携では文字化けに注意
# Pythonの例
json.dumps(data, ensure_ascii=False) # 日本語をそのまま出力
Q8: パフォーマンステストはどうやる?
A: 実際のデータで計測しましょう。
import time
import json
data = {"large": "data" * 10000}
# シリアライゼーションの速度測定
start = time.time()
json_str = json.dumps(data)
end = time.time()
print(f"シリアライゼーション: {end - start}秒")
# デシリアライゼーションの速度測定
start = time.time()
restored = json.loads(json_str)
end = time.time()
print(f"デシリアライゼーション: {end - start}秒")
まとめ: シリアライゼーションを使いこなそう
シリアライゼーションについて解説してきました。最後にポイントをまとめます。
重要ポイント:
- シリアライゼーションはデータを保存・送信可能な形式に変換すること
- JSON、XML、YAML、バイナリ形式など複数の選択肢がある
- 用途に応じて適切な形式を選ぶことが重要
- セキュリティとパフォーマンスを常に意識する
- ほぼすべてのプログラミング言語で標準サポートされている
シリアライゼーションは、現代のプログラミングに欠かせない基本技術です。
データの永続化、システム間連携、API通信など、あらゆる場面で活用されています。最初は難しく感じるかもしれませんが、一度理解すればとても便利な技術ですよ。
まずは簡単なJSONでのシリアライゼーションから始めて、徐々に他の形式や高度な使い方にチャレンジしてみてください!
それでは、実践的なプログラミングライフを!

コメント