Java: Enregistrer des objets dans un fichier texte? Existe-t-il des solutions toutes faites?
Question
Je souhaite enregistrer les objets générés dans un programme. Après le redémarrage, l'application devrait charger automatiquement tous les objets d'un tableau. Je veux les écrire dans un fichier et les analyser après le redémarrage. Les autres possibilités sont-elles plus intelligentes que de le faire à la main? Merci
La solution
Vous pouvez utiliser la classe Berkeley DB PersistentMap
pour enregistrer vos objets ( Serializable
) dans une implémentation Map
. (un cache) qui les persiste dans un fichier. C’est très simple à utiliser et vous évite de devoir vous soucier de savoir où enregistrer.
Trois remarques sur la sérialisation:
- Comment allez-vous gérer les modifications de schéma (c'est-à-dire modifier les données de vos classes - ajouter un nouveau champ par exemple)
- Que se passe-t-il si votre fichier est corrompu? En fonction de la fiabilité du stockage de votre programme, votre décision en matière de sauvegarde des données que vos objets contiennent implicitement sera affectée. N'oubliez pas que vous pouvez toujours utiliser une base de données relationnelle telle que MySQL , puis convertir ces données en objets .
- Avez-vous besoin de pouvoir afficher ou interroger les données extérieures de votre programme? Que faire si vous souhaitez répondre à une question simple, telle que "Combien d'objets ont la propriété X?" Facile à faire si vous avez utilisé une base de données (relationnelle); pas si facile si vous avez sérialisé des trucs dans des fichiers!
Autres conseils
Oui, le concept que vous recherchez s'appelle la sérialisation. ici , vous y trouverez un excellent didacticiel.
L'idée est que les classes que vous souhaitez conserver doivent implémenter l'interface Serializable. Ensuite, utilisez java.io.ObjectOutputStream.writeObject () pour écrire l’objet dans un fichier et java.io.ObjectInputStream.readObject () pour le relire.
Vous ne pouvez pas tout sérialiser, car certaines choses n’ont pas de sens, mais vous pouvez les contourner. Voici une citation à ce sujet:
Le mécanisme de base de Java la sérialisation est simple à utiliser, mais il y a encore plus de choses à savoir. Comme mentionné précédemment, seuls les objets marqués Sérialisable peut être persisté. le La classe java.lang.Object ne fonctionne pas mettre en œuvre cette interface. Donc, tous les objets en Java peuvent être persisté automatiquement. La bonne nouvelle est-ce que la plupart d'entre eux - comme AWT et Faire pivoter les composants, les chaînes et les interfaces graphiques tableaux - sont sérialisables.
D'autre part, certains classes de niveau système telles que Thread, OutputStream et ses sous-classes, et Les sockets ne sont pas sérialisables. Effectivement, cela n'aurait aucun sens s'ils étaient. Par exemple, thread en cours d'exécution dans ma machine virtuelle utilisera mon système Mémoire. Persister et essayer de l'exécuter dans votre machine virtuelle n'aurait aucun sens du tout. Un autre point important à propos de java.lang.Object n'implémentant pas le Interface sérialisable est que tout classe que vous créez qui s'étend seulement Object (et aucun autre serializable classes) n'est pas sérialisable sauf si vous implémentez l'interface vous-même (comme dans l'exemple précédent).
Cette situation pose un problème: Et si nous avons une classe qui contient une instance de Thread? Dans ce cas, pouvons-nous jamais persister objets de cette type? La réponse est oui, tant que nous dire au mécanisme de sérialisation notre intentions en marquant notre classe Objet de thread en tant que transitoire.
Vous pouvez consulter Effective Java pour quelques problèmes liés à la sérialisation. Celles-ci sont généralement avancées, mais si cette fonctionnalité est une partie essentielle de votre application, vous voudrez bien les connaître à l'avance.
Les exemples incluent les problèmes de sécurité, l'héritage et, plus important encore, le potentiel de "geler" publiquement une API pour la réaliser (par exemple, à travers différentes versions de logiciels). Encore une fois, ils sont tous avancés et ne devraient pas vous décourager en tant que tels.
java.io.Object [Input / Output] Stream sont les deux classes à examiner.
Toute classe que vous souhaitez conserver dans un fichier doit implémenter l'interface java.io.Serializable.
Vous pouvez également envisager d’utiliser le codage XML, qui me semble plus durable que la sérialisation. Utilisez les classes java.beans.XMLEncoder / XMLDecoder
.
Je ne l'ai pas utilisé, mais le code Google a publié protobuf récemment.
Je suis d'accord avec mjlee sur le fait que les tampons de protocole de Google sont un meilleure façon de stocker des objets que la méthode de sérialisation originale. Jetez un coup d'oeil et vous allez l'adorer.
Je me demande pourquoi personne n'a mentionné JSON et, par exemple, sérialiseur Jackson JSON .