2010-05-27 4 views
5

Je souhaite ajouter de la persistance à mon application basée sur Swing; et c'est la première fois que je fais quelque chose comme ça. Je sais comment utiliser les APIs de sérialisation Java (bien que j'utilise xstream à la place), je sais que JComponent sont sérialisables, mais je m'intéresse à d'autres considérations architecturales: comment une application devrait être conçue pour la rendre persistante devient facile; etc.Rendre les applications Java Swing persistantes

Je serais heureux de voir toutes les sources avec, bien que je serais aussi heureux examen de ces questions en profondeur d'entendre certaines des meilleures pratiques explicitement :)

Répondre

7

Vous devez utiliser un model-view-controller approach. Vous ne sérialisez que le modèle, pas la vue. La vue doit être remplie à partir du modèle. Sérialisation composants Swing est pas recommandé de toute façon du tout:

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

En regardant ce que vous avez, vous devriez avoir quelques classes qui sont votre modèle et contiennent uniquement des données. Ces classes seront sérialisées en utilisant XStream quelque part. Vos classes Swing ont alors des méthodes pour recevoir ces classes de modèles et remplir les champs et les éditeurs. Vous pouvez ensuite étendre l'interface utilisateur, par exemple, sans devoir modifier la classe, ajouter plus de fonctionnalité ou fournir des vues différentes pour le même ensemble de données. Pour que le composant Swing puisse être plus sophistiqué, il ne doit pas stocker et charger le modèle, mais vous devez avoir une interface de contrôleur que vous transmettez au composant swing pour effectuer ces opérations. De cette façon, vous pouvez mieux tester les unités et découpler la logique de stockage de la logique de vue.

Si XStream est correctement configuré, et si vous faites attention au modèle et aux champs, il devrait être possible d'ajouter plus de champs à vos classes de modèle sans casser la compatibilité ascendante.

Je ne recommande pas d'utiliser Java Serialization de toute façon, car il n'est pas recommandé de l'utiliser pour le stockage. La sérialisation Java excelle à l'invocation de méthode à distance. Il est relativement fragile lorsque les classes de modèles changent ..

0

Et le javadoc dit (par exemple sur JComponent): Au 1.4, le soutien pour le stockage à long terme de tous JavaBeansTM a été ajouté au paquet java.beans. S'il vous plaît voir XMLEncoder.

Voir aussi XMLEncoder. Du point de vue architectural, cette sérialisation fonctionne mieux avec les beans, les collections et la notion de valeur par défaut. Sur les beans, il enregistre uniquement les beans de propriétés avec une valeur différente de la valeur par défaut. (désolé pour mon anglais)

Vous pouvez configurer cela comme vous voulez.

+0

Si le bean java est nouveau et utilisé pour les données, XMLEncoder est une bonne idée. Sinon, je pense toujours que sérialiser un JComponent est en général une mauvaise pratique. –

+0

@Mario Ortegón: Oui, je suis d'accord; mais l'homme peut voir la "version bean" d'un JComponent comme un modèle de conception: il n'y a pas d'écouteurs, par exemple, seulement couleur, fond, position ... Donc, si on veut sérialiser/désérialiser, il faut reconstruire le controler logique. Je pense que l'encodeur XML n'est pas très bon, mais ce n'est pas très mauvais. C'est intéressant :-) – Istao