[Wicket-ja-user 557] Re: 匿名クラスをネストするとWicketNotSerializableExceptionが発生する

Back to archive index

Tsutomu Yano t_yano****@me*****
2011年 8月 11日 (木) 03:42:52 JST


矢野です。

まあ考え方次第なのかもしれませんが、私の考え方としては、

IComponentInstantiationListenerの実装クラスはSerializableである必要はないでしょう。IComponentInstantiationListenerはApplicationの一部であり、Application自体、Serializableじゃないからです。ほかのリスナ類についても同じです。この手のListener類はみな、Applicationの属性の一部で、ApplicationはSerializableじゃないのですから、これらもSerializableである必要を感じません。

そして、AbstractAjaxBehaviorはもとからIClusterbleであり、Serializableです。なので特に問題ないですね。BehaviorはComponentの属性の一部であり、すべてのComponentはSerializableなのですから、BehaviorはSerializableであるべきです。

今回の場合、私は、componentにaddしているAbstractAjaxBehaviorが、匿名内部クラスとして暗黙的にIComponentInstantiationListenerを内包しているのが問題だと感じます。本来シリアライズ可能であるAbstractAjaxBehaviorを、IComponentInstantiationListenerを内包する実装方法を選択することによって、敢えてシリアライズできなくしてしまっていると感じるからです。

(さらに言えば、IComponentInstantiationListenerはApplicationの内部クラスなので、なんと、Applicationインスタンスまで内包する巨大なAbstractAjaxBehaviorができてしまいます)。

なので、私ならば、AbstractAjaxBehaviorを、匿名クラスではなくて、static内部クラスなり、トップレベルのクラスなりとして宣言すると思います。BehaviorはListenerを必要としてないわけですし。

匿名クラスとシリアライズのからみは、難しいところですね…

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------

On 2011/08/10, at 23:48, maga****@hagan***** wrote:

> お世話になっています。船田です。
> 
> Applicationクラスで,
> addComponentInitializationListenerの引数で
> 匿名クラスを持たせた匿名クラスのリスナを使用しました。
> 
> addComponentInitializationListener(new IComponentInitializationListener() {
>    @Override
>    public void onInitialize(Component component) {
>        component.add(new AbstractAjaxBehavior() {
>            @Override
>            public void onRequest() {
>                // 
>            }
>        });
>    }
> });
> 
> ページをシリアライズするタイミングで
> 匿名クラスであるAbstractAjaxBehaviorをシリアライズしようとしますが、
> ネスト元であるIComponentInitializationListenerがSerializableでもIClusterableでもないため
> SerializableCheckerに引っかかります。
> 
> org.apache.wicket.util.io.SerializableChecker$WicketNotSerializableException: Unable to serialize class: com.mycompany.wickettest.MyApplication$1
> 
> 
> この場合
> 
> public interface MyComponentInitializationListener extends IComponentInitializationListener, Serializable
> public class MyAjaxBehavior extends AbstractAjaxBehavior
> 
> という具合にどちらかを匿名クラスにしないで実装するべきなのでしょうか?
> 
> 
> IComponentInitializationListener
> のほかに
> IComponentInstantiationListener
> IComponentOnAfterRenderListener
> IComponentOnBeforeRenderListener
> 
> も同じようにWicketNotSerializableExceptionが投げられます。
> 
> 多少、使い方が違うとはいえ IHeaderContributorには IClusterableがついているので
> ListenerクラスにもIClusterableがつくべきなのでは、と思ってます。
> 
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user




Wicket-ja-user メーリングリストの案内
Back to archive index