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