メインコンテンツまでスキップ

シリアライゼーション概要

データフォーマット(シリアライゼーション形式)の基本概念と、主要なフォーマットの比較を解説します。


シリアライゼーションとは

シリアライゼーションとは、プログラム内のデータ構造をバイト列(または文字列)に変換することです。

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

プログラム内のデータ
┌─────────────────────┐
│ { │
│ name: "山田太郎", │
│ age: 30 │
│ } │
└─────────────────────┘

│ シリアライズ(直列化)

┌─────────────────────┐
│ バイト列/文字列 │
│ {"name":"山田太郎", │
│ "age":30} │
└─────────────────────┘

│ 転送・保存

┌─────────────────────┐
│ ネットワーク送信 │
│ ファイル保存 │
│ データベース保存 │
└─────────────────────┘

│ デシリアライズ(復元)

┌─────────────────────┐
│ プログラム内のデータ │
│ { │
│ name: "山田太郎", │
│ age: 30 │
│ } │
└─────────────────────┘

なぜ複数のフォーマットがあるのか

用途によって求められる特性が異なるためです。

要件テキスト系バイナリ系
人間が読める
サイズ大きい小さい
パース速度遅い速い
デバッグしやすさ
バイナリデータの扱いBase64 必要ネイティブ
用途別の選択:

Web API(人間も読む)
→ JSON

IoT・組み込み(リソース制約)
→ CBOR, MessagePack

高性能 RPC
→ Protocol Buffers, gRPC

暗号・証明書(歴史的経緯)
→ ASN.1/DER

主要フォーマットの比較

同じデータを各フォーマットで表現

元のデータ:
{
"name": "John",
"age": 30
}

JSON(テキスト)

{"name":"John","age":30}

サイズ: 24 バイト

CBOR(バイナリ)

A2                    # map(2)
64 # text(4)
6E616D65 # "name"
64 # text(4)
4A6F686E # "John"
63 # text(3)
616765 # "age"
18 1E # unsigned(30)

サイズ: 17 バイト(約 30% 削減)

MessagePack(バイナリ)

82                    # fixmap(2)
A4 # fixstr(4)
6E616D65 # "name"
A4 # fixstr(4)
4A6F686E # "John"
A3 # fixstr(3)
616765 # "age"
1E # positive fixint(30)

サイズ: 16 バイト


JSON

最も広く使われるテキスト形式のフォーマット。

特徴

JSON の特徴:

✅ メリット:
- 人間が読める
- ほぼすべての言語でサポート
- デバッグしやすい
- Web 標準(HTTP API)

❌ デメリット:
- サイズが大きい
- パースが遅い
- バイナリデータは Base64 エンコード必要
- コメントが書けない

データ型

文字列"hello"
数値123, 3.14
真偽値true, false
nullnull
配列[1, 2, 3]
オブジェクト{"key": "value"}

使用例

  • JWT のペイロード
  • OAuth/OIDC のレスポンス
  • REST API

CBOR

IETF 標準のバイナリフォーマット。「JSON のバイナリ版」として設計。

特徴

CBOR の特徴:

✅ メリット:
- コンパクト
- パースが高速
- バイナリデータをネイティブサポート
- IETF 標準(RFC 8949)
- 拡張可能(タグ機能)

❌ デメリット:
- 人間が直接読めない
- デバッグにツールが必要

データ型

JSON のすべての型に加えて:

追加の型説明
バイト列バイナリデータ(Base64 不要)
タグ意味を付与(日時、BigNum など)
単純値undefined, 特殊値
浮動小数点half(16bit), float(32bit), double(64bit)

使用例

  • WebAuthn/FIDO2(認証器データ)
  • mdoc/mDL(モバイル運転免許証)
  • COSE(署名・暗号化)
  • IoT(CoAP プロトコル)

ASN.1/DER

古くから暗号分野で使われるフォーマット。

特徴

ASN.1/DER の特徴:

✅ メリット:
- 厳密なスキーマ定義
- 暗号分野で広く採用
- 国際標準(ITU-T)

❌ デメリット:
- 複雑
- 学習コストが高い
- デバッグが難しい

用語

用語説明
ASN.1スキーマ定義言語(Abstract Syntax Notation One)
BER基本エンコーディング規則
DER厳密エンコーディング規則(BER のサブセット)
PEMBase64 + ヘッダー(-----BEGIN...

使用例

  • X.509 証明書
  • PKCS#7, PKCS#8, PKCS#12
  • CRL(証明書失効リスト)
  • OCSP

フォーマット選択のガイドライン

フローチャート:

開始


人間が読む必要がある?
│ │
Yes No
│ │
▼ ▼
JSON サイズ/速度が重要?
│ │
Yes No
│ │
▼ ▼
CBOR JSON


暗号/証明書関連?
│ │
Yes No
│ │
▼ ▼
ASN.1/DER CBOR

アイデンティティ技術での使い分け

技術領域フォーマット理由
OAuth/OIDCJSONWeb 標準、既存エコシステム
JWTJSON (Base64)Web 互換、可読性
WebAuthnCBOR認証器のリソース制約、バイナリ効率
mdocCBORサイズ効率、オフライン検証
X.509ASN.1/DER歴史的経緯、PKI 標準

ツール

オンラインデコーダー

フォーマットツール
JSONJSON Formatter
CBORcbor.me
ASN.1ASN.1 JavaScript decoder
Base64Base64 Decode

コマンドラインツール

# JSON を整形
echo '{"name":"John"}' | jq .

# CBOR をデコード(要インストール)
# Python: pip install cbor2
python -c "import cbor2; print(cbor2.loads(bytes.fromhex('a2646e616d65644a6f686e63616765181e')))"

# Base64 デコード
echo 'eyJuYW1lIjoiSm9obiJ9' | base64 -d

# ASN.1 を表示(OpenSSL)
openssl asn1parse -in certificate.pem

まとめ

データフォーマットの選択:

┌─────────────────────────────────────────────────────────────┐
│ │
│ JSON: │
│ - Web API、人間が読むデータ │
│ - OAuth/OIDC、JWT │
│ │
│ CBOR: │
│ - バイナリ効率が必要な場面 │
│ - WebAuthn、mdoc、IoT │
│ │
│ ASN.1/DER: │
│ - 証明書、暗号鍵 │
│ - X.509、PKCS │
│ │
│ 実務では: │
│ 既存のエコシステムに合わせて選択 │
│ 新規設計なら JSON か CBOR が一般的 │
│ │
└─────────────────────────────────────────────────────────────┘

次のステップ

ドキュメント内容
CBORCBOR の詳細な構造とエンコード方式
COSECBOR ベースの署名・暗号化
ASN.1 と DER証明書で使われるフォーマット