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

标签 java serialization wicket

我在一些模型对象的日志中看到 NotSerializedException,我知道解决此问题的方法是使它们可序列化,但我们还看到有关组件未添加到页面的 MarkupExceptions,并且我'我想知道这是否相关。我们仅在生产中看到启用集群的错误。

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

最佳答案

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

您绝对应该避免不必要的序列化对象。这包括响应 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

关于java - 当模型对象不可序列化时,在集群 wicket 环境中会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19250475/

相关文章:

java - SOAP 服务中的时区不匹配

Java - 更改变量值而不访问它

java - Mockito 缺少any*() 静态方法 1. 如何合理替换?

java - 使用 BufferedImage 序列化对象的 ArrayList

c# - MongoDB 在 InsertOne 上抛出 "MongoDB.Bson.BsonSerializationException"

java - Wicket ajax 控件更新行为重叠

java - 将现有的 Wicket 应用程序用于 Android 应用程序

Java Post 连接使用 Try 和资源

C - 序列化技术

wicket - 为什么我得到 "The component(s) below failed to render"?