まつもと ゆきひろです

In message "Re: [ruby-dev:36773] Re: [Bug #650] Marshal.load raises RegexpError"
    on Sat, 18 Oct 2008 07:05:07 +0900, Urabe Shyouhei <shyouhei / ruby-lang.org> writes:

|> |> 厳密に言うとmarshalに上位互換性がないのでmarshalのメジャーバー
|> |> ジョンを変化させるべきなのかもしれませんが、メリットよりもデ
|> |> メリットの方が大きいのでそれはしない方向を考えてます。
|>
|> |ちなみにどういうデメリットですか?
|>
|> 1.8と1.9でmarshalデータが全くやりとりできないというデメリッ
|> トです。
|
|まったくということはないでしょう。
|1.8で作ったデータを1.9が読めように1.9を作るのは可能なはずです。
|# 今でも、古いmarshal formatのデータを読もうとすると、警告が出るが処理自
|体はできるはず。

Marshalファイルフォーマットには、メジャーバージョンとマイナー
バージョンの情報が付加されており、マイナーバージョンの違いは
「上位互換性がある」ので「古いmarshal formatのデータを読もう
とすると、警告が出るが処理自体はできる」、メジャーバージョン
の違いは「互換性はないので古いデータは読めない」とする仕組み
があります。

今回の場合は、古いデータが新しいMarshalで読めない(Marshal以
外の部分の変更に影響を受けた)というものなので、Marshal側でで
きる対応は

 (1) 杓子定規に考えて、メジャーバージョンをあげる(1.8と1.9が
     通信できなくなる、うれしくない)

 (2) ささいな違いなので気にしない

 (3) 1.8で正規化する(すでに書き込んだデータは救済できないし、
     副作用もある)

 (4) 1.9側に1.8正規表現かどうか判別して1.9正規表現に変換する
     (おそらくは巨大な)ルーチンを追加する(苦労の割に得るもの
     が少ない、うれしくない)

くらいではないかと思います。現状のリソースから考えると、2か3
くらいがせいぜいではないかと思います。

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