Java: Enregistrer des objets dans un fichier texte? Existe-t-il des solutions toutes faites?

StackOverflow https://stackoverflow.com/questions/170554

  •  05-07-2019
  •  | 
  •  

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

Était-ce utile?

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:

  1. 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)
  2. 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
  3. .
  4. 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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top