エンコーディングとシリアライゼーション
データを転送 / 保存可能な形式に変換する手法の総称
エンコーディングとシリアライゼーションとは
エンコーディングはデータを特定の形式に変換する処理、シリアライゼーションはメモリ上のオブジェクトをバイト列に変換して転送・保存可能にする処理である。JSON.stringify はシリアライゼーション、Base64 はエンコーディングの例。
用語の整理
用語の整理を以下に示す。
| 用語 | 方向 | 例 |
|---|---|---|
| シリアライズ | オブジェクト → バイト列 | JSON.stringify() |
| デシリアライズ | バイト列 → オブジェクト | JSON.parse() |
| エンコード | データ → 特定形式 | Base64, URL エンコード |
| デコード | 特定形式 → データ | Base64 デコード |
| マーシャリング | オブジェクト → 転送形式 | DynamoDB の型情報付き JSON |
シリアライゼーション形式の比較
シリアライゼーション形式の比較を以下に示す。
| 形式 | 種類 | サイズ | 速度 | スキーマ | 用途 |
|---|---|---|---|---|---|
| JSON | テキスト | 大きい | 中程度 | なし | Web API |
| Protocol Buffers | バイナリ | 小さい | 高速 | 必須 | gRPC |
| MessagePack | バイナリ | 小さい | 高速 | なし | キャッシュ |
| CBOR | バイナリ | 小さい | 高速 | なし | IoT |
| Avro | バイナリ | 小さい | 高速 | 必須 | Kafka |
TypeScript での操作
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('a b&c=d'); // 'a%20b%26c%3Dd'
const jaEncoded = encodeURIComponent('東京'); // '%E6%9D%B1%E4%BA%AC'
btoa は 1 文字を 1 バイトとして扱うため、日本語のようなマルチバイト文字を直接渡すと DOMException (Invalid character) になる。先に TextEncoder で UTF-8 のバイト列へ変換してから Base64 化する必要がある。encodeURIComponent は内部で UTF-8 に変換するため、日本語 1 文字が %XX 3 個 (9 文字) に膨らむ点も見積もりで効いてくる。
DynamoDB のマーシャリング
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 が適している。
エンコーディングとシリアライゼーションを扱う関連書籍も多い。
この記事は役に立ちましたか?
関連用語
JSON
JavaScript 由来の軽量なデータ交換フォーマットで、Web API のデファクトスタンダード
Protocol Buffers
Google が開発した効率的なバイナリシリアライゼーションフォーマットで gRPC の標準データ形式
Base64
バイナリデータを ASCII テキストに変換するエンコーディング方式で、メールや JSON でのバイナリ転送に使われる
Unicode
世界中の文字を統一的に表現するための文字コード規格
エンディアン
2 バイト以上のデータをメモリやファイルに格納する際の、バイトの並び順を定める規約
カナリアリリース
新バージョンを少数のユーザーに先行公開し、問題がないことを確認してから全体に展開するデプロイ手法
関連する記事
技術書のタイトルに隠された法則 - 「入門」「実践」「詳解」の意味を読み解く
技術書のタイトルに使われる「入門」「実践」「詳解」などのキーワードには暗黙のルールがあります。タイトルだけで本のレベルと内容を見抜くコツを紹介します。
ゼロから作る Deep Learning シリーズの読む順番 - 全 6 巻の内容と選び方を整理
ゼロから作る Deep Learning シリーズ全 6 巻 (基礎 / 自然言語処理 / フレームワーク / 強化学習 / 生成モデル / LLM) の読む順番を解説。各巻の内容 / 発売年 / 前提知識を一覧表で整理し、目的別にどの巻から読むべきかを案内します。
技術書がエンジニアのキャリアを変える - 読書習慣と年収の関係
技術書の読書習慣がエンジニアのキャリアアップに影響する 3 つの経路と、ジュニア / ミドル / シニア各段階に応じた読書戦略を具体的に解説します。