シリアライズ/シリアライゼーション

データの直列化とも言われるシリアライゼーション。意味をつかみかねていたのでググッて調べてみた。

データの直列化とは,大雑把に言えばPerlのデータ構造(スカラー,配列,ハッシュ,リファレンスなど)を単一の文字列で表現することだ。

構造を持ったデータをファイルとして保存したり、ネットワークを通じて送ったりする必要が生じたとしましょう。その場合、メモリ上のデータをそのまま送るわけにはいきませんから、複雑な構造を壊さないように注意しながら一次元のバイト列に変換します。これがシリアライゼーションです。

ソフトウェア内部で扱っているデータを丸ごと、ファイルで保存したりネットワークで送受信することができるように変換すること。

  • Cでとある設定データを保存している構造体の情報をまるまるバイナリでファイルに保存して、次回起動時に読み込むとかやってたことがあったけど、それに近いのかな。
  • データの持つ意味としてはどちらも同じだけど、どのレイヤでデータを扱うかの違いかな。例えばPerlのデータ構造をYAMLとかJSONファイルに落とし込むとすると、IOのレベルではバイト/ビット単位で扱うことになるので直列的になる。一方で言語レベルではハッシュや配列を使って構造的に取り扱える。
  • このシリアライズという言葉を使う時は単に直列化するということだけじゃなくて、加えて本来言語特有である内部形式の構造化されたデータを「汎用的に扱えるように」という意味がプラスされている気がする。
  • Wikipediaに面白い例えが書いてあった。

シリアライズは、SFなどに登場する転送装置に喩えられることがある。物質を一旦量子に変換してから遠隔地に転送し再び物質に戻すというテレポーテーションがシリアライズに似ていることからそう喩えられた。これはまさに、他のネットワーク上にあるシリアライズされたオブジェクトをファイルとしてリモートから転送してからデシリアライズして外部メソッドを自分のネットワーク上で呼び出すために利用されるJava RMIの動作原理にも似ている。

    • 転送装置と聞いてスタートレックを思い浮かべた自分は古いのかしら・・。てゆーかRMIってそうやって動いてるんだ。