我在一些模型对象的日志中看到NotSerializableException,我知道对此的修复是为了使它们可序列化,但是我们也看到MarkupExceptions关于组件没有被添加到页面而且我'我想知道这是否相关。我们只看到了打开群集的生产中的错误。
所以我的问题是,当模型对象不可序列化时会发生什么,即使它的所有属性都是可序列化的?
答案 0 :(得分:1)
据我所知,如果你没有将一个类声明为可序列化的,那么后续动作(例如表单提交,行为,AJAX)的序列化版本将会丢失它。因此,当反序列化对象时,如果无法从存储中成功重新加载子对象,则任何对象引用都可能为null。
绝对应该避免不必要地序列化对象。这包括响应AJAX请求。
最佳做法要求:
仅存储所需的最小序列化对象
为每个请求加载对象 - 尤其是模型对象,应在处理每个请求时从数据存储库加载
将数据对象加载到构造函数之外
为所有数据使用模型,并尝试镜像Wicket结构以简化(例如,使用CompoundPropertyModel,其中使用反射从模型对象加载字段,基于wicket:id使用)
< / LI>对任何已加载的大型对象使用可拆卸模型
避免过多使用匿名内部类 - 使用正确的事件处理程序,以便您的代码更易于阅读和维护。
我已经在一个复杂的Wicket应用程序上工作了一段时间,我可以告诉你,你想避免因过度使用序列化/反序列化而出现重复的对象 - 这可能是调试和修复的噩梦。
阅读这些内容以获取更多信息/建议:
http://letsgetdugg.com/2009/04/19/wicket-anti-patterns-avoiding-session-bloat/ https://cwiki.apache.org/confluence/display/WICKET/Best+Practices+and+Gotchas