我在最近的一个项目中偶然发现了一些序列化问题。
虽然存在一些常见的错误,例如bean在视图范围内而没有实现Serializable
但是有一些更复杂的问题,我现在没有答案。
1)当注入的实例不可序列化时,如何处理@ManagedProperty
?
在这种情况下,将注入一个以单例Spring
bean实现的服务。虽然我可以标记属性transient
,但在对托管bean进行反序列化时,这将使属性保留null
。另一种相当不明智的方法是省略属性并在需要服务时进行查找(在getService()
方法中封装了probabyl)。
虽然使用范围代理的Spring
bean有一种方法,但我不确定在不使用Spring
时这个问题应该如何解决,或者另一个具有比'Request'更长的范围的非Spring bean是注射。
2)在检查ViewMap
期间,我注意到它有时不可序列化,因为默认情况下某些Mojarra
内置类不可序列化,例如javax.faces.view.facelets.ConverterHandler
。我不明白为什么Mojarra
在ViewMap
中提出这个问题。
3)在2)中进行观察:
是否有必要使用标准Java序列化方法对ViewMap进行Serializable?根据我的理解,最终在HttpSession
中的所有内容都需要序列化,但也许有一些我不知道的Mojarra
应用的隐藏序列化技巧。
4)除非设置com.sun.faces.serializeServerState
,否则反序列化似乎永远不会发生。
我将private void writeObject(ObjectOutputStream out) throws IOException
和private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
放在@ViewScoped
bean中,以查看序列化是如何发生的。但有趣的是,虽然writeObject
在生命周期完成时调用,readObject
永远不会被调用,除非设置了上面提到的context-param
。这导致了一个问题,即为什么对象在永远不会被反序列化时被序列化。
使用Mojarra 2.1.6对Tomcat 7.0.11进行了观察。
如果有更多见解的人能够对此有所了解,那就太好了。
THX