0

我在一些模型对象的日志中看到了 NotSerializableException,我知道解决这个问题的方法是使它们可序列化,但我们也看到关于未添加到页面的组件的 MarkupExceptions,我想知道是否这可能是相关的。我们只看到启用集群的生产中的错误。

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

4

1 回答 1

1

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

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

最佳实践规定:

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

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

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

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

  5. 对加载的任何大型对象使用可拆卸模型

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

我一直在研究一个复杂的 Wicket 应用程序,我可以告诉您,您希望避免由于过度使用序列化/反序列化而出现重复对象 - 调试和修复可能是一场噩梦。

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

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

于 2013-11-11T11:42:54.390 回答