2010-05-27 115 views
5

我想为基于Swing的应用程序添加持久性;这是我第一次做这样的事情。我知道如何使用Java序列化API(尽管我使用的是xstream),但我知道JComponent是可序列化的,但我对更多体系结构考虑感兴趣:应如何设计应用程序以使其持久化变得容易;等使Java Swing应用程序持久化

我很乐意看到任何来源有深入考虑这些问题,但我会还高兴地听到明确的一些最佳做法:)

回答

7

你应该使用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 Classes具有接收这些模型类并填充字段和编辑器的方法。然后,您可以扩展UI,而无需更改类,添加更多功能,或为同一数据集提供不同的视图。

为了使它更有趣,Swing组件不应该存储和加载模型,但是您应该有一个控制器接口,您将其传递给swing组件以执行这些操作。这样,您可以更好地进行单元测试,并将存储逻辑从视图逻辑中分离出来。

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

我不推荐使用Java序列化,因为将它用于存储不是一个好习惯。 Java序列化擅长于远程方法调用。它是相对脆弱的,当模型类改变..

0

而且说的javadoc(例如在JComponent):从1.4版本开始,所有JavaBeansTM长期存储的支持已被添加到java.beans包。请参阅XMLEncoder。

所以参见XMLEncoder

从vue的体系结构来看,这个序列化最适合于bean,集合和默认值的概念。在bean上,它只保存具有与默认值不同的值的属性bean。 (对不起,我的英语)

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

+0

如果java bean是新的并且用于数据,那么XMLEncoder是个好主意。否则,我仍然认为序列化JComponent通常是一种不好的做法。 – 2010-05-27 14:40:29

+0

@MarioOrtegón:是的,我同意;但是人可以将JComponent的“bean版本”看作一个ligth设计模型:没有听众,例如只有颜色,背景,位置......所以,如果我们想序列化/反序列化,就需要重新构建控制器逻辑。我认为XML编码器不是很好,但它不是很糟糕。这真有趣 :-) – Istao 2010-05-27 16:11:46