From: matz@... (Yukihiro Matsumoto) Date: 2003-10-14T12:34:22+09:00 Subject: [ruby-list:38544] Re: marshal_dump (was Re: ) まつもと ゆきひろです In message "[ruby-list:38543] Re: marshal_dump (was Re: )" on 03/10/14, "NAKAMURA, Hiroshi" writes: |ちなみに、債務を分割する場合、各クラスにおいて、そのクラスで導入した |インスタンス変数が取り出せると便利です。例えばmarshal_dumpペアが |定義されていないクラス階層では、rubyが、デフォルトで、そのクラスで |導入されたインスタンス変数のみを書き出してあげるとか。 現時点ではインスタンス変数には「導入したクラス」に関する情報 がなにもついていないので不可能ですね。将来、private instance variable(って呼ぶのが良いのかどうか)が導入されれば、それらに ついては可能である可能性が高いですね。 私はmarshalをカスタマイズする必要性に遭遇したことがないので、 正直なところ「なんでもダンプ可能」という現状よりも「より良い」 ものについてのイメージが十分ではありません。いろいろ意見を聞 きたいところではあります。 |> すいません。Javaについてあまり知識が無いので、「loadの後に呼 |> んでくれて」、「元のオブジェクトとすりかえる」という記述が具 |> 体的にはイメージできませんでした。もうちょっと説明していただ |> けませんか? | class Foo implements Serializable { | private static final Foo singleton = new Foo(); | | public static final Foo getInstance() { return singleton; } | | private Foo() {} | | private void readObject(ObjectInputStream in) | throws IOException, ClassNotFoundException { | in.defaultReadObject(); | } | | private Object readResolve() { | return singleton; | } | } | |こんなことをしておくと、Fooのserialized formatを読み込む際、 |readObjectで新たなFooインスタンスが生成されたあと、そいつの |readResolveメソッドが呼ばれ、返ってきたsingletonが、読み込む |オブジェクトグラフ中に代わりに埋め込まれます。readObjectで |作られた新たなFooインスタンスはすぐに捨てられます。 |readResolveが呼ばれるタイミングは、serialize formatを読み込んで |いく最中、readObjectを呼んでオブジェクトの構築が終わった直後です。 |http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/input.doc6.html だいたい理解できました。私の理解が正しいとすると、Rubyなら marshal_loadがちょうどreadResolveに相当するのではないでしょ うか。readObjectがないぶん簡単と言うか、柔軟性が低いと言うか。 まつもと ゆきひろ /:|)