MessagePack for Java 0.6.0 の TemplateRegistry について

0
Sadayuki Furuhashi @frsyuki

ClassLoader には親子関係があり、親のClassLoaderでロードされたクラスが、フィールドに子のClassLoaderでロードされたクラスのインスタンスを持つことはあり得ない…は合っているかな。

2011-08-20 11:48:03
Sadayuki Furuhashi @frsyuki

ぃゃ合ってないな。FrameworkClass { public Object field; } があるとき、frameworkClass.field = new AppClass() ができる。

2011-08-20 11:51:43
Sadayuki Furuhashi @frsyuki

ClassLoader キーにしてオブジェクトグラフをキャッシュするのは、本質的に不完全なのか。

2011-08-20 11:55:15
Sadayuki Furuhashi @frsyuki

all classes in the "java.* packages can only be defined by the bootstrap class loader. だけは活用できる可能性がある。 http://t.co/9KBPkvv

2011-08-20 11:57:34
Sadayuki Furuhashi @frsyuki

superclassを辿りながらlookupした結果ヒットしたクラスで、java.* なクラスのキャッシュは、BootstrapTemplateRegistry にキャッシュする案。このケースを除いて、BootstrapTemplateRegistryはimmutable。

2011-08-20 12:01:22
Sadayuki Furuhashi @frsyuki

ぃゃ Root の TemplateRegistry が immutable である必要は何だろう…。子の TemplateRegistry に登録したクラスの superclass のキャッシュが登録されてしまうとマズイからか。

2011-08-20 12:04:49
Sadayuki Furuhashi @frsyuki

superclassをlookupした結果のキャッシュは、parent.cache ではなく this.cache にキャッシュするべきなのかな。

2011-08-20 12:07:01
Sadayuki Furuhashi @frsyuki

ぃゃ現状でもそうだな。interfaceの方はparent.registerだな…これはthis.registerかな。

2011-08-20 12:07:52
Muga Nishizawa @muga_nishizawa

@frsyuki おぉ… ちょうど template registry をレビューされてるんですね

2011-08-20 12:11:53
Sadayuki Furuhashi @frsyuki

@muga_nishizawa そうなんです。TemplateRegistryどうするか問題を考えつつ、です。

2011-08-20 12:12:46
Sadayuki Furuhashi @frsyuki

TemplateRegistry.register を呼ばないケースでも、毎回 new MessagePack() したくない理由の一つは、HashMap や ArrayList をシリアライズするために superclass lookup が入ってしまう点。

2011-08-20 12:14:32
Muga Nishizawa @muga_nishizawa

Root の template registry の cache を immutable にした方がよいというのは、例えば、string オブジェクトの default template を上書きされたくないからという理由があります。

2011-08-20 12:17:08
Muga Nishizawa @muga_nishizawa

もし default template の挙動を変えたければ、子の template registry にその template を登録したらよいのではないかなと思って、そのデータ構造になってます。

2011-08-20 12:17:57
Sadayuki Furuhashi @frsyuki

superclass/interface lookup にたどり着くまでに、TemplateBuilderChain.select とかリフレクションがいくつか入るので。new MessagePack().write(xxx) は、newのコストに加えてリフレクション分遅い。

2011-08-20 12:18:33
Muga Nishizawa @muga_nishizawa

もちろん全く新しい template registry を作って、そっちの default の string template を上書きすればよいということも考えられます。ただ、重複した default templates は複数あるので、入れ子の構造の方がよいかと思いました。

2011-08-20 12:19:32
Sadayuki Furuhashi @frsyuki

なるほど。入れ子の方が良いですね。

2011-08-20 12:20:42
Sadayuki Furuhashi @frsyuki

やはり共有はマズイ。それとは別に、java.* のパッケージなクラスに対する最適化を入れたいな。

2011-08-20 12:21:56
Muga Nishizawa @muga_nishizawa

TODO: root template registry の template cache を immutable にする…

2011-08-20 12:23:07
Sadayuki Furuhashi @frsyuki

親にregisterしたときに子にも反映されればOKかな。というのは msgpack = new MessagePack(); json = new JSON(msgpack); msgpack.register(MyClass.class) のため。

2011-08-20 12:24:03
Sadayuki Furuhashi @frsyuki

@muga_nishizawa 見たところ、TemplateRegistry.java:247 の parent.register を register にすれば、parentが変更されることは無さそうです。

2011-08-20 12:25:35
Sadayuki Furuhashi @frsyuki

@muga_nishizawa parent.lookupGenericImpl時にキャッシュは追加されるかもしれませんが、それはOKですよね。

2011-08-20 12:25:51
Sadayuki Furuhashi @frsyuki

> lookupGenericImpl の中で lookup を呼んでいるため

2011-08-20 12:26:35