From: matz@... (Yukihiro Matsumoto) Date: 2003-10-13T20:32:58+09:00 Subject: [ruby-list:38531] Re: marshal_dump (was Re: ) まつもと ゆきひろです In message "[ruby-list:38526] Re: marshal_dump (was Re: )" on 03/10/13, "NAKAMURA, Hiroshi" 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の後に呼 んでくれて」、「元のオブジェクトとすりかえる」という記述が具 体的にはイメージできませんでした。もうちょっと説明していただ けませんか? まつもと ゆきひろ /:|)