我刚刚在最近的一个项目中偶然发现了一些序列化问题。虽然有一些常见的错误,比如 bean 驻留在视图范围内而没有实现Serializable
,但还有一些更复杂的问题,我现在没有答案。
@ManagedProperty
1)当注入的实例不可序列化时如何处理?Spring
在这种情况下,注入了作为单例 bean 实现的某个服务。虽然我可以标记该属性,transient
但这会null
在托管 bean 的反序列化时保留该属性。另一种相当不美观的方法是省略属性并在需要服务时进行查找(可能封装在getService()
方法中)。虽然有一种Spring
使用范围代理的 bean 方法,但我不确定在Spring
不使用或注入另一个具有比“请求”更长范围的非 Spring bean 时应该如何解决这个问题。
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
并查看序列化是如何发生的。但有趣的是,虽然
在生命周期完成时被调用,但永远不会被调用,除非上面提到的设置。这导致了一个问题,为什么对象永远不会被反序列化时被序列化。private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
@ViewScoped
writeObject
readObject
context-param
此观察是在 Tomcat 7.0.11 上使用 Mojarra 2.1.6 进行的。
如果有更多见解的人能够对此有所了解,那就太好了。
谢谢