最近のプロジェクトでシリアライゼーションの問題に遭遇しました。Bean が実装せずにビュー スコープ内に存在するなどのよくある間違いがいくつかSerializable
ありますが、より複雑な問題がいくつかありますが、それに対する答えは今のところありません。
@ManagedProperty
1)注入されたインスタンスがシリアライズできない場合の対処方法は? この場合、シングルトンSpring
Bean として実装された特定のサービスが注入されます。属性をマークすることはできますが、マネージド Bean のデシリアライズ時transient
に属性がそのまま残ります。null
もう 1 つのかなり見栄えの悪いアプローチは、属性を省略し、サービスが必要なときにルックアップを行うことです (メソッドにカプセル化されている可能性がありますgetService()
)。スコープ付きプロキシを使用する Bean のアプローチがありますが、が使用されていない場合、または「リクエスト」よりも有効期間が長い別の非 Spring Bean が注入さSpring
れている場合に、この問題をどのように解決する必要があるかはわかりません。Spring
2) の検査中に、デフォルトでシリアライズ可能でないViewMap
いくつかの組み込みクラスが原因で、シリアライズ可能でない場合があることに気付きました。とにかくこれがなぜ入れられたのか理解できません。Mojarra
javax.faces.view.facelets.ConverterHandler
Mojarra
ViewMap
3) 2) で行った観察: ViewMap を標準の Java シリアライゼーション メソッドでシリアライズ可能にする必要がありますか? 私の理解では、シリアライズ可能にする必要があるものはすべてシリアライズ可能である必要がありますが、私が気付いていないHttpSession
シリアライゼーションの隠されたトリックが適用されている可能性があります。Mojarra
4) が設定されている場合を除き、逆シリアル化は行われないようcom.sun.faces.serializeServerState
です。シリアル化がどのように行われるかを確認するために、Bean にprivate void writeObject(ObjectOutputStream out) throws IOException
andを入れました。しかし興味深いことに、
Lifecycle の完了時に呼び出される while は、上記が設定されている場合を除き、決して呼び出されません。これは、オブジェクトが逆シリアル化されないのに、なぜオブジェクトがシリアル化されているのかという疑問につながります。private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
@ViewScoped
writeObject
readObject
context-param
この観察は、Tomcat 7.0.11 上の Mojarra 2.1.6 で行われました。
より多くの洞察を持っている人がこれに光を当てることができれば素晴らしいでしょう.
どうも