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

Java 当模型对象不可序列化时,集群wicket环境中会发生什么?,java,serialization,wicket,Java,Serialization,Wicket,我在一些模型对象的日志中看到一个NotSerializableException,我知道解决这个问题的方法是使它们可序列化,但我们也看到了关于未添加到页面的组件的MarkupException,我想知道这是否相关。我们只看到在启用集群的生产环境中出现的错误 所以我的问题是,当一个模型对象不可序列化时会发生什么,即使它的所有属性都是可序列化的?据我所知,如果您不将一个类声明为可序列化的,那么它将在后续操作(例如表单提交、行为、AJAX)的序列化版本中丢失。因此,当对象被反序列化时,如果无法成功地从

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


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

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

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

最佳做法规定:

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

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

  • 在构造函数外部加载数据对象

  • 对所有数据使用模型,并尝试镜像Wicket结构以简化操作(例如,使用CompoundPropertyModel,根据使用的Wicket:id,使用反射从模型对象加载字段)

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

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

  • 我已经在一个复杂的Wicket应用程序上工作了一段时间,我可以告诉您,您希望避免由于过度使用序列化/反序列化而出现重复的对象—调试和修复它可能是一场噩梦

    有关更多信息/建议,请阅读以下内容:


    发生了什么
    尝试时发生了什么
    应该在
    HashMap
    中。移除
    serializable
    接口并尝试发出请求。容器无法读取和写入。当模型对象未分离(例如,未连接到任何组件)时,会出现NotSerializableException,因此您可能应该先尝试分离模型?我不知道NotSerializableException和未添加到页面的组件之间有什么关系。我所要做的就是将模型对象标记为可序列化。这已经完成了,但我想知道当这些对象不可序列化时,wicket在幕后究竟做了什么。我了解到,在使用集群时可能会遇到问题,但我想知道这些问题是什么,并且还没有找到太多答案。您必须注意,一些可序列化的对象可能被包装在代理(e.x.实体)中。这可能会导致服务器端出现一些不一致的状态(但这只是猜测)和更大的内存使用量。我想你能做的最好的事情就是检查对象为什么没有分离。有人知道这会导致不一致的状态吗?如果是这种情况,它可能会在我的案例中创建一个标记异常。模型对象是一个列表。另一个列表确定要使用的片段(1、2、3或4单元格表行)。然后迭代模型列表,并将每个单元格添加到表行中。这两个列表的长度应该相同,但如果状态混乱,其中一个单元格可能无法添加,从而导致标记异常。