まつもと ゆきひろです

In message "[ruby-list:18989] marshaling SimpleDelegator"
    on 99/11/28, TAKEUCHi Kahori (竹内かほり) <take-k / secom-sis.co.jp> writes:

|SimpleDelegator の marshaling ができないので、どなたかお知恵
|くださいませ。検索はしてみたつもりなのですが、既出の話題でし
|たらすみません、その場合はポインタお教えくださいまし。

あー、すいません。pstoreのバグと呼んでも良いと思います。
# できないのは変わらないのですが。

|Ruby 本の Marshal の説明(p.255)に
|
|> ファイルへの書き出しを行えないクラスも存在していて(IO,Class など)
|
|とありますが、「など」にひっかかってしまったのでしょうか? そ
|れとももしかして IO, Class なのかしら…。あるクラスのインス
|タンスを marshal できる条件というのが marshal.c からは読みと
|れませんでした。IO, Class だったらダメ、というような記述はな
|かったように思いましたので、もうちょっと抽象的な条件なんです
|よね、きっと?

できないのは以下のものです。

  * 特異メソッドが定義されたオブジェクト
  * IOのサブクラス(T_FILEのもの)
  * Cのポインタをラップしたもの(T_DATAのもの)

要するに別プロセスに持っていく方法が一意に決まらないものです。
で、今回は最初の条件に当たってます。が、pstoreのバグでdumpに
失敗した例外が飲み込まれてました。pstoreのうち、

	  begin
	    file.rewind
	    Marshal::dump(@table, file)
	  rescue
	    File::rename backup, @filename if File::exist?(backup)
+	    raise
	  end

の部分にraiseを追加することできちんと失敗します。

で、どーしてもこれらのオブジェクトをdumpしたい時には、オブジェ
クトに _dump、クラスに _load というメソッドを用意することで
無理矢理marshalできます。

                                まつもと ゆきひろ /:|)