【问题标题】:Wicket wants to serialize my PanelWicket 想要序列化我的面板
【发布时间】:2011-10-17 06:19:06
【问题描述】:

当我访问 Wicket 应用程序的特定页面时,我收到 NotSerializableException:

java.io.NotSerializableException: my.package.MyPanel$1

但我无法解释为什么 wicket 应该尝试序列化 面板。有什么想法吗?

我不知道它是否有帮助,但这是我用来添加面板的代码:

final User profileUser = ...;
final IModel<User> loggedInUser = ...;
add(new MyPanel("panelid", new Model<MyObject>(new MyObject()))
    {
        @Override
        public boolean isVisible()
        {
            return profileUser != null && profileUser.equals(loggedInUser.getObject());
        }
    });

【问题讨论】:

    标签: serialization wicket


    【解决方案1】:

    Wicket 将许多内容序列化到会话中,作为其处理集群方法的一部分。

    Wicket 中的几乎所有内容(最终)都扩展了 Component,它实现了 IClusterable,它扩展了 Serializable。因此,在 Wicket 中创建的面板等组件需要可序列化。

    一种常见的做法是创建LoadableDetachableModel 类,使用仅在会话中存储一个键并使用该键重新加载的逻辑来包装您的普通业务对象。

    如果您将此类模型用作组件中的字段而不是完整的业务对象,您将减少会话内存的压力。

    【讨论】:

    • 谢谢,但在这种情况下是什么意思?我应该用 LoadableDetachableModel 包装 MyPanel 吗?
    • 没有。面板应该是可序列化的而不被包装。但是它或定义它的类包含一些不可序列化的东西,可能是一个业务对象,应该被包装。我必须查看更多代码,也许还有不可序列化的消息才能确定是什么。
    • 抱歉,发现问题了。在 MyPanel 中,我有一个不可序列化的实例变量。我看不到它,因为我打开了错误的文件(也许有点太晚了 :-) 无论如何:感谢您的出色回答
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2011-10-20
    • 2023-02-10
    • 2013-07-28
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多