1

我刚刚在最近的一个项目中偶然发现了一些序列化问题。虽然有一些常见的错误,比如 bean 驻留在视图范围内而没有实现Serializable,但还有一些更复杂的问题,我现在没有答案。

@ManagedProperty1)当注入的实例不可序列化时如何处理?Spring在这种情况下,注入了作为单例 bean 实现的某个服务。虽然我可以标记该属性,transient但这会null在托管 bean 的反序列化时保留该属性。另一种相当不美观的方法是省略属性并在需要服务时进行查找(可能封装在getService()方法中)。虽然有一种Spring使用范围代理的 bean 方法,但我不确定在Spring不使用或注入另一个具有比“请求”更长范围的非 Spring bean 时应该如何解决这个问题。

2)在检查过程中,ViewMap我注意到它有时是不可序列化的,因为一些Mojarra默认情况下不可序列化的内置类,例如javax.faces.view.facelets.ConverterHandler. 我不明白为什么无论如何都要这样做MojarraViewMap

3) 根据 2) 中的观察结果:ViewMap 是否需要使用标准 Java 序列化方法进行序列化?据我了解,最终的一切都HttpSession需要可序列化,但也许有一些Mojarra我不知道的隐藏的序列化技巧。

4)反序列化似乎永远不会发生,除非com.sun.faces.serializeServerState设置了。我在一个bean 中放入private void writeObject(ObjectOutputStream out) throws IOException并查看序列化是如何发生的。但有趣的是,虽然 在生命周期完成时被调用,但永远不会被调用,除非上面提到的设置。这导致了一个问题,为什么对象永远不会被反序列化时被序列化。private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException@ViewScopedwriteObjectreadObjectcontext-param

此观察是在 Tomcat 7.0.11 上使用 Mojarra 2.1.6 进行的。

如果有更多见解的人能够对此有所了解,那就太好了。

谢谢

4

0 回答 0