【しりあらいぜーしょん】

シリアライゼーション(直列化) とは?

最終更新:
💡 データを「一列の荷物」にして送り出す梱包作業
📌 このページのポイント
シリアライズとデシリアライズ オブジェクト {'{'} name: "Ken", age: 30 {'}'} メモリ上 シリアライズ バイト列/JSON {'{'}"name":"Ken", "age":30{'}'} 直列化データ 送信 保存 ネットワーク /ストレージ 受信データ {'{'}"name":"Ken","age":30{'}'} バイト列/JSON デシリアライズ 復元オブジェクト {'{'} name: "Ken", age: 30 {'}'} メモリ上 オブジェクト → シリアライズ → バイト列 → 送信/保存 → デシリアライズ → オブジェクト 異なるシステム間でデータを交換するための変換プロセス
シリアライズとデシリアライズ
ひよこ ひよこ
シリアライゼーションって何のためにやるの?
ペンギン先生 ペンギン先生
プログラムの中にあるデータって、メモリ上ではバラバラな場所に散らばっているんだ。それをファイルに保存したりネットワークで送ったりするには、一列に並んだ形に変換しないといけない。この「梱包作業」がシリアライゼーションだよ。
ひよこ ひよこ
具体的にはどんな形に変換するの?
ペンギン先生 ペンギン先生
よく使われるのはJSONだね。たとえば{name: "Ken", age: 30}というオブジェクトを'{"name":"Ken","age":30}'という文字列に変換する。他にもXMLバイナリ形式など、用途に応じていろいろなフォーマットがあるよ。
ひよこ ひよこ
元に戻すこともできるの?
ペンギン先生 ペンギン先生
もちろん!元に戻すのを「デシリアライゼーション」と呼ぶよ。受け取った文字列バイト列から元のオブジェクトを復元するんだ。ただし信頼できないデータを復元すると悪意あるコードが実行される脆弱性があって、「安全でないデシリアライゼーション」としてセキュリティの世界ではよく注意喚起されているポイントだよ。
ひよこ ひよこ
JSONProtocol Buffersってどう使い分けるの?
ペンギン先生 ペンギン先生
JSONは人間が読めるテキスト形式で、Web APIフロントエンドとの通信に最適。Protocol Buffers(protobuf)はバイナリ形式でサイズが小さく高速だから、マイクロサービス間の内部通信やgRPCで使われるよ。「外向きはJSON、内向きはprotobuf」が一般的な使い分けだね。
ひよこ ひよこ
安全でないデシリアライゼーションってどう防ぐの?
ペンギン先生 ペンギン先生
一番の対策は「信頼できないデータをオブジェクトとしてデシリアライズしない」こと。JavaのObjectInputStreamや、PythonのpickleでWebから受け取ったデータを復元するのは非常に危険。代わりにJSONのように、構造だけを復元して任意のコード実行ができないフォーマットを使うべきだよ。実際にApache Struts2の脆弱性では、デシリアライゼーション攻撃で大量の個人情報が漏洩した事例があるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シリアライゼーション」って出てきたら「プログラムのデータを保存・通信できる形に変換することだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「serialization」 = 直列にすること・連続化
💬 serialは「連続した・一列の」という意味。データを一列に並べて送れる形にするイメージだよ
← 用語集にもどる