IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Serialisation/deserialisation d'un arrayList retourne des objets vides


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 58
    Points
    58
    Par défaut Serialisation/deserialisation d'un arrayList retourne des objets vides
    bonjour,

    j'utilise la serialisation pour sauvegarder mes données, notament je serialize un arraylist comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ArrayList<FishObject> objects = null;
    ... affectation de objects ...
    FileOutputStream fos = new FileOutputStream("monfichier");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(objects);
    oos.flush();
    oos.close();
    FishObject est bien serialisable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class FishObject extends Object3D implements Comparable<FishObject>, Serializable{
    et sauf erreur de ma part, apres un bon paquet de debug mon arrayList objects contient bien des données avant d'être sérialisé

    Quand je recharche tout ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fis = new FileInputStream("monfichier");
    ois = new ObjectInputStream(fis);
    objects = (ArrayList<FishObject>) ois.readObject();
    ois.close();
    mon arrayList objects est plein d'objets vides (attributs aux valeurs par défaut), il semble quand bien que le nombre d'objets est bon au moins
    Alors là je vois pas ...
    help

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Et si on jetait un coup d'oeil dans le fichier?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 58
    Points
    58
    Par défaut
    Bé oui !
    mais j'ai du mal a lire le binaire ... comment faire ?
    fichier joint (nucleus.ser dans une archive zip)

    Merci
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par cdtkoenig
    mon arrayList objects est plein d'objets vides (attributs aux valeurs par défaut)
    Est ce que ces attributs sont hérités de la classe Object3D ? Si oui, celle ci est-elle bien Serializable ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 58
    Points
    58
    Par défaut
    Bingo
    Object3D n'etait pas marqué comme serialisable et avait un attribut de type Pixel3D qui ne l'etait pas non plus.
    Je profite pour poser une aute question sur la serialisation :
    n'est-il pas risqué de stocker des données via la serialisation car si j'ai bien compris, si j'ajoute un attribut à ma classe dans 3 mois, mon appli ne pourra plus charger les fichiers de la version n-1 ?
    Comment faire autrement sans passer trop de temps à coder tout ca ?

    Merci

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Tu peux tenter la sérialisation XML.

    Les sauvegardes sont plus faciles à modifier "à la main", et sont compréhensibles quand on les ouvre avec un éditeur de texte, ce qui n'est pas le cas d'un fichier binaire
    Elles passent mieux d'une version de ton programme à la suivante qui a un attribut en plus (enfin... tout dépend de la manière dont tu codes ta sérialisation)

    Par contre, les fichiers ainsi créés sont plus gros. Et si tu parses tes fichiers avec Dom, cela peut poser des problèmes si tes sauvegardes sont trop volumineuses
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 58
    Points
    58
    Par défaut
    Merci pour ta réponse, que me conseilles-tu pour attaquer la serialisation XML (une lib, un tuto, ...) ?
    Sinon, j'ai lu sur http://www.mactech.com/articles/mact...ion/index.html
    que certaines modif n'empechaient pas de relire des objets sérialisés de version précédentes : notament l'ajout d'attribut ne semble pas poser de problème car java utilise la valeur par défaut des nouveaux attributs dans ce cas (en gardant le SUID compatible). Ca me rassure mais je reste circonspect sur le binaire, interressé par le xml et globalement assez faineant alors ....

    Merci

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Pour la sérialisation XML l'API XStream est plutôt sympa (efficace et pas compliquée) .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    Par défaut Info sur la sérialisation
    Pour décourvrir les secrets de la sérialisation :
    http://java.sun.com/developer/techni...serialization/

    en gros, l'atribut SerialUID permet à ta classe d'être acceptée à tous les coups par le ObjectStream, mais tu prend le risque d'avoir un résultat incohérent, alors dans ce cas il vaut mieux redéfinir ta propre sérilization:
    1. soit en surchargeant les méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    180   private void writeObject(ObjectOutputStream out) throws IOException
    190   {
    200     out.defaultWriteObject();
    220   }
    230   private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    240   {
    250     // our "pseudo-constructor"
    260     in.defaultReadObject();
    270     // now we are a "live" object again, so let's run rebuild and start
    280     // autre traitement à toi
    290
    300   }
    2. soit en implémentant "Externalizable" ce qui te rend sérializable et te permet de créer ton propre mécanisme de séralisation.

    Arpès, il faut bien gérer tes version: ajouter un N° de version d'enregistrement dans ta classe (je ne pense pas qu'on puisse utiliser directement le SerialUID, risque de plantage) , et avoir un bloc pour désérialiser chaque version pour maintenir la compatibilité ascendante.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 99
    Points : 58
    Points
    58
    Par défaut
    Vraiment sympa Xstream, et simple à utiliser, par contre, ca multiplie les volumes par 5 (200 ko vs 1Mo) et pareil pour le temps de rechargement des objets en ram. Du coup, je continue a à me tater ...
    En tout cas, j'ai les réponses à mes questions !

  11. #11
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Sinon voici un tutoriel sur la sérialisation binaire en Java qui pourrait t'intéresser.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 4] Formulaire d'envoi toujours retourne des valeurs vides..
    Par linusminus dans le forum Langage
    Réponses: 1
    Dernier message: 04/08/2014, 11h00
  2. SQL Server retourne des champs vides
    Par Ferllings dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/02/2011, 14h16
  3. [PDO] Query retourne des champs vides
    Par ToonToon1 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/01/2011, 16h25
  4. [Problèmes avec ArrayList] Supprimer des objets égaux à null
    Par smutmutant2003 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 08/10/2009, 10h43
  5. Intercepter des objets "vides".
    Par CRUSOE13 dans le forum Access
    Réponses: 9
    Dernier message: 27/06/2005, 00h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo