当模型对象不可序列化时,在集群窗口环境中会发生什么?

时间:2013-10-08 14:27:46

标签: java serialization wicket

我在一些模型对象的日志中看到NotSerializableException,我知道对此的修复是为了使它们可序列化,但是我们也看到MarkupExceptions关于组件没有被添加到页面而且我'我想知道这是否相关。我们只看到了打开群集的生产中的错误。

所以我的问题是,当模型对象不可序列化时会发生什么,即使它的所有属性都是可序列化的?

1 个答案:

答案 0 :(得分:1)

据我所知,如果你没有将一个类声明为可序列化的,那么后续动作(例如表单提交,行为,AJAX)的序列化版本将会丢失它。因此,当反序列化对象时,如果无法从存储中成功重新加载子对象,则任何对象引用都可能为null。

绝对应该避免不必要地序列化对象。这包括响应AJAX请求。

最佳做法要求:

  1. 仅存储所需的最小序列化对象

    • 避免声明变量'final'并从匿名内部类引用这些变量
    • 避免将太多对象存储为序列化对象(页面,面板或列表等)中的字段
  2. 为每个请求加载对象 - 尤其是模型对象,应在处理每个请求时从数据存储库加载

  3. 将数据对象加载到构造函数之外

  4. 为所有数据使用模型,并尝试镜像Wicket结构以简化(例如,使用CompoundPropertyModel,其中使用反射从模型对象加载字段,基于wicket:id使用)

    < / LI>
  5. 对任何已加载的大型对象使用可拆卸模型

  6. 避免过多使用匿名内部类 - 使用正确的事件处理程序,以便您的代码更易于阅读和维护。

  7. 我已经在一个复杂的Wicket应用程序上工作了一段时间,我可以告诉你,你想避免因过度使用序列化/反序列化而出现重复的对象 - 这可能是调试和修复的噩梦。

    阅读这些内容以获取更多信息/建议:

    http://letsgetdugg.com/2009/04/19/wicket-anti-patterns-avoiding-session-bloat/ https://cwiki.apache.org/confluence/display/WICKET/Best+Practices+and+Gotchas