まつもと ゆきひろです

In message "[ruby-list:38526] Re: marshal_dump (was Re: )"
    on 03/10/13, "NAKAMURA, Hiroshi" <nakahiro / sarion.co.jp> writes:

|ちなみにJavaでは、dumperが、クラス階層内の各クラスの
|writeObjectメソッドをそれぞれ呼んでくれるので(2種類あるserialize
|インタフェイスの手軽なほう)、各クラスが、自分で定義した
|インスタンス変数(とは呼ばないけど)を書き出すことで、救えます。
|writeObjectメソッドが定義されてない場合、デフォルトで全ての
|インスタンス変数(同)が書き出されます。

えーと、writeObjectメソッドはサブクラスでoverrideされていよ
うがなんだろうが個別に呼ばれるんですか。Rubyではあんまりそう
いうのはやってないんで考えてませんでしたけど、それが良いと言
うなら検討の余地はあります。

|Rubyでは、インスタンス変数がどのクラスで定義されているか、
|あまり意識してない人が多いような気がします(?)。よって咳さんの
|書かれてるように、Javaみたいにクラス階層をたどることで債務分割を
|するのでなく、一番下位のmarshal_dump/marshal_loadを定義するヤツが
|気をつけて全部やれ、とするのもアリだと思います。

現時点ではそうなってますね。

|関連してひとつ、別の提案ですが、Javaでは、とあるメソッド(readResolve)を
|定義しておくと、loadの後に呼んでくれて、そいつが返したオブジェクトを元の
|オブジェクトとすりかえる、という機能があります。singletonやenumな
|クラスで、loaderが生成した新規オブジェクトを、singletonオブジェクトと
|すりかえられます。

すいません。Javaについてあまり知識が無いので、「loadの後に呼
んでくれて」、「元のオブジェクトとすりかえる」という記述が具
体的にはイメージできませんでした。もうちょっと説明していただ
けませんか?

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