エンコーディングとシリアライゼーション
データを転送・保存可能な形式に変換する手法の総称
データ形式基礎
エンコーディングとシリアライゼーションとは
エンコーディングはデータを特定の形式に変換する処理、シリアライゼーションはメモリ上のオブジェクトをバイト列に変換して転送・保存可能にする処理である。JSON.stringify はシリアライゼーション、Base64 はエンコーディングの例。
用語の整理
| 用語 | 方向 | 例 |
|---|---|---|
| シリアライズ | オブジェクト → バイト列 | JSON.stringify() |
| デシリアライズ | バイト列 → オブジェクト | JSON.parse() |
| エンコード | データ → 特定形式 | Base64, URL エンコード |
| デコード | 特定形式 → データ | Base64 デコード |
| マーシャリング | オブジェクト → 転送形式 | DynamoDB の型情報付き JSON |
シリアライゼーション形式の比較
| 形式 | 種類 | サイズ | 速度 | スキーマ | 用途 |
|---|---|---|---|---|---|
| JSON | テキスト | 大きい | 中程度 | なし | Web API |
| Protocol Buffers | バイナリ | 小さい | 高速 | 必須 | gRPC |
| MessagePack | バイナリ | 小さい | 高速 | なし | キャッシュ |
| CBOR | バイナリ | 小さい | 高速 | なし | IoT |
| Avro | バイナリ | 小さい | 高速 | 必須 | Kafka |
TypeScript での操作
// JSON シリアライゼーション
const obj = { name: 'Alice', age: 30 };
const json = JSON.stringify(obj); // '{"name":"Alice","age":30}'
const parsed = JSON.parse(json); // { name: 'Alice', age: 30 }
// Base64 エンコーディング
const encoded = btoa('Hello'); // 'SGVsbG8='
const decoded = atob('SGVsbG8='); // 'Hello'
// URL エンコーディング
const urlEncoded = encodeURIComponent('エンコーディングとシリアライゼーション'); // 'Hello%20World!'
DynamoDB のマーシャリング
import { marshall, unmarshall } from '@aws-sdk/util-dynamodb';
// マーシャリング: JS オブジェクト → DynamoDB 形式
marshall({ id: '1', name: 'Alice', age: 30 });
// { id: { S: '1' }, name: { S: 'Alice' }, age: { N: '30' } }
// アンマーシャリング: DynamoDB 形式 → JS オブジェクト
unmarshall({ id: { S: '1' }, name: { S: 'Alice' } });
// { id: '1', name: 'Alice' }
選択基準
Web API (ブラウザ ↔ サーバー) には JSON、マイクロサービス間の高スループット通信には Protocol Buffers、キャッシュ (Redis) には MessagePack か JSON、IoT の帯域制限環境には CBOR が適している。
エンコーディングとシリアライゼーションを扱う関連書籍も多い。