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

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

最終更新:
💡 データを、保存や通信に使える形へ梱包する

データ構造やオブジェクトを、保存・通信に使える文字列やバイト列へ変換する処理。読み取ってデータにする逆の処理はデシリアライゼーションと呼ぶ。

📌 このページのポイント
データを梱包して、保存・通信するデータname: Kenage: 30JSON文字列{"name":"Ken","age":30}直列化 →← デシリアライズ保存・通信に使う何を戻せるかは、形式によって違う
JSONで名前と年齢を扱う例。データから文字列へ変換し、文字列を読み取ってデータにします。暗号化や、すべての振る舞いの復元とは別です。
ひよこ ひよこ
プログラムのデータを、そのまま送れないの?
ペンギン先生 ペンギン先生
別のプログラムに渡すには、相手が読める形式にする必要があるよ。たとえば名前と年齢のデータを、JSONの文字列にする。メモリの配置を丸ごと送ることではなく、値や構造を保存・通信できる形に表す処理なんだ。
ひよこ ひよこ
具体的には、どう変わるの?
ペンギン先生 ペンギン先生
JavaScriptのJSON.stringifyで、nameがKen、ageが30のオブジェクトを文字列にできる。図のJSONは{"name":"Ken","age":30}。受け取った側はJSON.parseで、その文字列をデータとして読み取れるよ。暗号化とは別の処理だね。
ひよこ ひよこ
戻せば、完全に元どおり?
ペンギン先生 ペンギン先生
形式が表現できる情報だけだよ。JavaScriptのJSON.stringifyでは、オブジェクトの関数やundefinedのプロパティは省かれ、循環参照はそのまま扱えない。元のクラスやすべての振る舞いまで自動で戻ると考えず、必要なデータを決めよう。
ひよこ ひよこ
JSONとProtocol Buffersは、どちらがいいの?
ペンギン先生 ペンギン先生
JSONは文字列として読めるので、中身を確認しやすい。Protocol Buffersは.protoで構造を定義し、生成されたコードなどでバイト列を扱う仕組みだよ。対応言語・形式の変更・扱うデータを考えて選ぶ。「外部は必ずJSON、内部は必ずprotobuf」という決まりではないんだ。
ひよこ ひよこ
受け取ったデータを読むのは、危険なの?
ペンギン先生 ペンギン先生
復元方法によるよ。Pythonのpickleは、細工されたデータの復元時に任意のコードが動く可能性があり、信頼できないデータをunpickleしないよう公式資料が警告している。JSONを読むこと自体とは区別するけれど、JSONでも型・内容・サイズの検証と、その後の扱いは必要だよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シリアライゼーション」って出てきたら「データを、保存や通信に使える形に変換すること」と思えばだいたいOK!
📖 おまけ:英語の意味
「serialization」 = 直列にすること・連続化
💬 serialは「連続した・一列の」という意味。データを一列に並べて送れる形にするイメージだよ

参考資料

← 用語集にもどる