1

最近のプロジェクトでシリアライゼーションの問題に遭遇しました。Bean が実装せずにビュー スコープ内に存在するなどのよくある間違いがいくつかSerializableありますが、より複雑な問題がいくつかありますが、それに対する答えは今のところありません。

@ManagedProperty1)注入されたインスタンスがシリアライズできない場合の対処方法は? この場合、シングルトンSpringBean として実装された特定のサービスが注入されます。属性をマークすることはできますが、マネージド Bean のデシリアライズ時transientに属性がそのまま残ります。nullもう 1 つのかなり見栄えの悪いアプローチは、属性を省略し、サービスが必要なときにルックアップを行うことです (メソッドにカプセル化されている可能性がありますgetService())。スコープ付きプロキシを使用する Bean のアプローチがありますが、が使用されていない場合、または「リクエスト」よりも有効期間が長い別の非 Spring Bean が注入さSpringれている場合に、この問題をどのように解決する必要があるかはわかりません。Spring

2) の検査中に、デフォルトでシリアライズ可能でないViewMapいくつかの組み込みクラスが原因で、シリアライズ可能でない場合があることに気付きました。とにかくこれがなぜ入れられたのか理解できません。Mojarrajavax.faces.view.facelets.ConverterHandlerMojarraViewMap

3) 2) で行った観察: ViewMap を標準の Java シリアライゼーション メソッドでシリアライズ可能にする必要がありますか? 私の理解では、シリアライズ可能にする必要があるものはすべてシリアライズ可能である必要がありますが、私が気付いていないHttpSessionシリアライゼーションの隠されたトリックが適用されている可能性があります。Mojarra

4) が設定されている場合を除き、逆シリアル化は行われないようcom.sun.faces.serializeServerStateです。シリアル化がどのように行われるかを確認するために、Bean にprivate void writeObject(ObjectOutputStream out) throws IOExceptionandを入れました。しかし興味深いことに、 Lifecycle の完了時に呼び出される while は、上記が設定されている場合を除き、決して呼び出されません。これは、オブジェクトが逆シリアル化されないのに、なぜオブジェクトがシリアル化されているのかという疑問につながります。private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException@ViewScopedwriteObjectreadObjectcontext-param

この観察は、Tomcat 7.0.11 上の Mojarra 2.1.6 で行われました。

より多くの洞察を持っている人がこれに光を当てることができれば素晴らしいでしょう.

どうも

4

0 に答える 0