Marshal

Ruby オブジェクトをファイル(または文字列)に書き出したり、読み戻したり する機能を提供するモジュール。大部分のクラスのインスタンスを書き出す事 ができますが、書き出しの不可能なクラスも存在します(後述)。

モジュール関数:

Marshal.dump(obj[,port][,limit])

obj を再帰的にファイルに書き出します。ファイルに書き出せない オブジェクトをファイルに書き出そうとすると例外 TypeError が 発生します。ファイルに書き出せないオブジェクトは以下の通りです。

また、これらのオブジェクトを間接的に指すオブジェクトなども書き出せ ません。*1

port には IO(またはそのサブクラス)のインスタンスを指定 します。この場合、port を返します。省略した場合には dump はそのオブジェクトをダンプした文字列を返します。

出力するオブジェクトがメソッド `_dump' を定義している場合に は、ファイル出力はそのメソッドを使って行われます。メソッド `_dump' は引数として再帰を制限するレベル limit を受け 取り、オブジェクトを文字列化したものを返します。

インスタンスがメソッド `_dump' を持つクラスは必ず同じフォー マットを読み戻すクラスメソッド `_load' を定義する必要があり ます。`_load' はオブジェクトを表現した文字列を受け取り、それ をオブジェクトに戻したものを返す必要があります。

limit を指定した場合、limit 段以上深くリンクしたオブジェ クトをダンプできません(デフォルトは 100 レベル)。負の limit を指定すると深さチェックを行いません。

Marshal.load(port[,proc])
Marshal.restore(port[,proc])

port からオブジェクトを読み込んで来て、元のオブジェクトと同 じ状態をもつオブジェクトを生成します。port は文字列か IO(またはそのサブクラス)のインスタンスを指定します。

proc として手続きオブジェクトが与えられた場合には読み込んで 来るオブジェクトを引数にその手続きが呼び出されます (Fixnum, Symbol は渡されない)。

str = Marshal.dump(["a", 1, 10 ** 10, 1.0, :foo])
p Marshal.load(str, proc {|obj| p obj})

# => []
     "a"
     10000000000
     1.0
     ["a", 1, 10000000000, 1.0, :foo]

定数:

MAJOR_VERSION ((<ruby 1.7 feature>))
MINOR_VERSION ((<ruby 1.7 feature>))

Marshal.dump が出力するデータフォーマットのバージョ ン番号です。

Marshal.load は、メジャーバージョンが異なるか、バー ジョンの大きなマーシャルデータを読み込んだとき例外 TypeError を発生させます。

マイナーバージョンが古いだけのフォーマットは読み込み可能ですが、 $VERBOSE = true のときには警告メッセージが 出力されます

マーシャルされたデータのバージョン番号は以下のようにして取得するこ とができます。

obj = Object.new
major, minor = Marshal.dump(obj).unpack("cc")
p [major, minor]

*1デフォルト値を求めるブロックを持った HashProc を間接的に指している扱いになります。