【问题标题】:Making Java Swing applications persistent使 Java Swing 应用程序持久化
【发布时间】:2011-02-24 16:03:40
【问题描述】:

我想为我的基于 Swing 的应用程序添加持久性;这是我第一次做这样的事情。

我知道如何使用 Java 序列化 API(尽管我使用的是 xstream),我知道 JComponent 是可序列化的,但我对更多的架构考虑感兴趣:应如何设计应用程序以使其持久化简单;等等

我很高兴看到深入考虑这些问题的任何来源,但我也很高兴明确听到一些最佳实践:)

【问题讨论】:

    标签: java swing architecture persistence


    【解决方案1】:

    您应该使用model-view-controller approach。您只序列化模型,而不是视图。应该从模型中填充视图。无论如何都不推荐序列化 Swing 组件:

    While Swing components do implement the Serializable interface, they are not portable between different versions of the Java Virtual Machine

    看看你有什么,你应该有一些类是你的模型并且只有数据。这些类将在某处使用 XStream 进行序列化。然后,您的 Swing 类具有接收这些模型类并填充字段和编辑器的方法。然后,您可以扩展 UI,例如,无需更改类、添加更多功能或为同一数据集提供不同的视图。

    为了让它更漂亮,Swing 组件不应该存储和加载模型,但您应该有一个控制器接口,您应该将其传递给 swing 组件以执行这些操作。这样,您可以更好地进行单元测试,并将存储逻辑与视图逻辑解耦。

    如果 XStream 配置正确,并且如果您注意模型和字段,则应该可以在不破坏向后兼容性的情况下向模型类添加更多字段。

    无论如何,我都不建议使用 Java 序列化,因为将它用于存储并不是一个好习惯。 Java 序列化擅长远程方法调用。模型类变化时比较脆弱..

    【讨论】:

      【解决方案2】:

      javadoc 说(例如JComponent):从 1.4 开始,java.beans 包中添加了对所有 JavaBeansTM 长期存储的支持。请参阅 XMLEncoder。

      XMLEncoder

      从 vue 的架构角度来看,这种序列化最适合 bean、集合和默认值的概念。在 bean 上,它只保存与默认值不同的属性 bean。 (对不起我的英语)

      您可以根据需要进行配置。

      【讨论】:

      • 如果 java bean 是新的并用于数据,XMLEncoder 是个好主意。否则,我仍然认为序列化 JComponent 通常是一种不好的做法。
      • @Mario Ortegón:是的,我同意;但是人们可以将 JComponent 的“bean 版本”看作是一个灯光设计模型:没有侦听器,例如,只有颜色、背景、位置……所以,如果我们想要序列化/反序列化,就必须重新构建控制器逻辑。我认为 XML 编码器不是很好,但也不是很差。这很有趣:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多