【问题标题】:Serialize a class using SpringLayout (Java)使用 SpringLayout (Java) 序列化一个类
【发布时间】:2012-08-07 20:07:14
【问题描述】:

我最近开始使用 Java 进行开发,并且非常享受这段经历。默认的 Java 包加载了有用的东西,并且拥有 Swing 包对创建 GUI 有很大帮助。我决定为我的 LayoutManager 使用 SpringLayout,因为它既简单又非常灵活,但现在我发现自己陷入了困境。

我希望能够保持我的应用程序的状态。我开始使用 Preferences API 来解决这个问题,但这只允许存储 Java 本机(可以理解 - 它的目标是轻量级)。我继续通过持久化包含数据的 XML 字符串来混杂 Preferences 的使用。过了一会儿,我决定环顾四周,看看是否有更好的地方,然后我开始阅读有关可序列化的内容 - 看起来我找到了答案。

但是,当我尝试序列化一个具有一些由 SpringLayout 管理的 GUI 组件的类时,我遇到了一个问题,我发现它没有实现可序列化。我以为我已经用transient 关键字找到了解决问题的方法,但SpringLayout 唯一允许的修饰符是final。我见过的唯一解决方法是更改​​我正在使用的 LayoutManager……我不想这样做,因为我已经创建了一些相当定制的 GUI。

有什么想法吗?

提前感谢所有回复。

-M

【问题讨论】:

    标签: java serializable springlayout


    【解决方案1】:

    什么意思

    SpringLayout 唯一允许的修饰符是final

    如果它是您的可序列化对象的一个​​字段,那么您可以将其声明为瞬态的。如果您无法控制对象中的所有字段,请尝试仅保留一个 State 对象,您将在其中写入所有相关数据。保留一个布局管理器不是一个好主意。

    【讨论】:

    • 嗯...我发现了我的问题-我试图将 SpringLayout 的本地实例声明为transient,而不是实际的类变量...呵呵。但是,为什么坚持一个实现Serializable 的布局管理器是个坏主意?
    • 大多数 LayoutManager 没有需要序列化的状态。对我来说,序列化应该针对底层数据,并且所有 UI 都应该针对程序的每次调用从头开始构建。
    • 明白。我有一些复选框,我想保留它们的选中/未选中状态,所以我会保留这些状态,在构建 UI 之后,我可以简单地设置这些状态。
    【解决方案2】:

    我试图将 构造函数本地 的 SpringLayout 实例声明为 transient。需要做的是将这些变量声明为类变量,然后修改为transient

    【讨论】:

    • 我已经浏览了我的源包中的每个类,并且在 SpringLayout 的 每个 声明之前都使用了瞬态,但我仍然收到 java.io.NotSerializableException: javax.swing.SpringLayout。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多