気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Ruby Marshalモジュールの概要をつかむ

Marshalモジュールの特徴

  • Rubyオブジェクトを文字列化して、ファイルに書きだしたり、読みだしたりできる。
  • 文字列化したデータをマーシャルデータと呼ぶ。
  • 文字列化できないクラスや書き出すオブジェクトに制限あり。
  • 文字列化できない場合、TypeErrorが発生する。

文字列化できない対象

  • 名前のついていないClassやモジュール。ArgumentErrorが発生する。
  • システムがオブジェクトの状態を保持するようなIOクラス、Dirクラス、Fileクラスなど
  • MatchDataクラス、Procクラス、Threadクラスなどのインスタンス
  • クラスメソッドを定義したオブジェクト
  • 上記オブジェクトを間接的に指定しているクラスのオブジェクト。具体例は以下に示す。
# デフォルト値を求めるブロックを持つHashは間接的にProcを指していることになる
p Marshal.dump(Hash.new {})
TypeError: can't dump hash with default proc

Rubyオブジェクトを文字列化、復元を行う

str = Marshal.dump({:a => 1, :b => 2, :c => 3})
# => "\x04\b{\b:\x06ai\x06:\x06bi\a:\x06ci\b"

Marshal.load(str)
# => {:a=>1, :b=>2, :c=>3}

Rubyオブジェクトを文字列化、復元を行う(ファイルに書き出す)

2つ目の引数にIOクラスかそのサブクラスのオブジェクトを指定すると書き出せる

file = File.open("/tmp/marshaldata", "w+")
Marshal.dump({:a => 1, :b => 3, :c => 5}, file)

# fileポインタが最後の位置にあるので最初から読み込めるように以下を実行
file.rewind
# => 0
Marshal.load(file)
# => {:a=>1, :b=>2, :c=>3}