まつもと ゆきひろです

In message "[ruby-dev:21176] marshalling ivtbl of Time"
    on 03/08/11, "NAKAMURA, Hiroshi" <nakahiro / sarion.co.jp> writes:

|marshal_dumpと_dumpのいずれかが定義されていた場合、
|ivtblの中身がdumpされないことになりましたが(そのほうが嬉しいと
|なひも賛成しました)、組み込みクラスの中でおそらく唯一、
|デフォルトで_dumpを持っているTimeはどう扱うべきでしょうか。

なんとなく解決してしまったような気がします。

|t = Time.new; t.instance_eval("@a = 1"); t2 = Marshal.load(
|  Marshal.dump(t)); p t2.instance_variables
|
|# => []? ["@a"]?
|
|過去どうだったか、正確に覚えてはいないのですが、1.6、現行の1.8は
|dumpされないものの、半年くらい前の1.8はdumpされたと思います
|(なひが以前書いたテストケースが正しければ)。
|
|「組み込み型については、marshal_dumpや_dumpをユーザが定義しない限り、
|ivtblはdumpされる」というルールのほうがわかりやすいような気がしますが、
|どうでしょうか。time_dumpはmarshal.cへ? あるいは組み込み型用API新設?
|あるいはTimeは特別?

結局、「インスタンス変数を復旧してから_loadあるいは
marshal_loadを呼ぶ」というルールにしました。インスタンス変数
をどうにかしたければ、loadルーチンでやれということで。なにも
しなければ、そのままインスタンス変数を保存します。