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

Java Discussion :

[Sérialisation] Je ne retrouve pas mes objets en input


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut [Sérialisation] Je ne retrouve pas mes objets en input
    Bonjour,

    J'ai un comportement étrange que je ne comprends pas :

    J'ai une classe déclarée SERIALIZABLE. En se déroulant, mon soft modifie les valeurs des champs de cette classe. Je veux écrire dans un fichier le contenu de cette classe pour chaque état.
    J'ai donc le code suivant pour écrire dans le fichier. La méthode write est appelée après chaque modif de la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	public boolean openFile() throws IOException
    	{
    		// open an output flow to a file
    		_fos = new FileOutputStream(_systemToStudy.get_fileAccess().getDestFile().toOSString()
    				+ ".raw");
    		// create an object flow for the output file
    		_oos= new ObjectOutputStream(_fos);
    		return true;
    	}
     
    	public void writeResults(StudySystem sys) throws IOException
    	{
    		_oos.writeObject(((BranchExtension)sys.getTopology().getBranchList().get(1)));
    		System.out.println("out = "+((BranchExtension)sys.getTopology().getBranchList().get(1)).get_currentMassicCalculatedFlow());
    		_oos.flush();
    	}
    J'ai fais une méthode extract pour vérifier le bon fonctionnement de l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    	public void extractResults() throws IOException, ClassNotFoundException
    	{
            FileInputStream fis = new FileInputStream(_systemToStudy
    				.get_fileAccess().getDestFile().toOSString()
    				+ ".raw");
            try {
                ObjectInputStream ois = new ObjectInputStream(fis);
                try {
                    boolean hasObject = true;
                    while(hasObject) {
                        try {
                        	BranchExtension b = (BranchExtension) ois.readObject();
                        	System.out.println("in = " +b.get_currentMassicCalculatedFlow());
                        } catch(EOFException oef) { hasObject = false; }
                    }
                } finally {
                    ois.close();
                }
            } finally {
                fis.close();
            }
    	}
    voici les résultats sur la console :
    out = -1075.6774753828747
    out = -210.93244535322964
    out = -104.97453861555508
    out = -69.85172908908521
    out = -52.33449780498369
    out = -41.839759537021116
    out = -34.850220347842736
    in = -1075.6774753828747
    in = -1075.6774753828747
    in = -1075.6774753828747
    in = -1075.6774753828747
    in = -1075.6774753828747
    in = -1075.6774753828747
    in = -1075.6774753828747
    On voit qu'il lit le bon nombre d'objet. Mais il me donne toujours le premier !!!
    J'ai tester en stockant une simple variable primitive et là ben ça marche.

    Ma classe BranchExtension ne comporte rien de particulier.

    Pour info, j'ai simplifié ces extraits de code pour faciliter la compréhension. En fait la méthode write va écrire beaucoup plus de données. Mais il n'empêche que ça ne marche déjà pas comme c'est là.

    Si quun pouvais me débloquer ce serait sympa. Merci d'avance.

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    Oups, si en fait la classe BranchExtension comporte une personnalisation de la sérialisation. Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    	/**
             * Serialization control to make _index value persistent cause to static state
             */
    	public static void serializeStaticState(ObjectOutputStream os) throws IOException {
    		  os.writeInt(_index); 
    		}
     
    		public static void deserializeStaticState(ObjectInputStream os) throws IOException {
    			_index = os.readInt();
    		}
     
    		private void writeObject(ObjectOutputStream stream) throws IOException{
    			stream.defaultWriteObject();
    			serializeStaticState(stream);
    		}
     
    		private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException{
    			stream.defaultReadObject();
    			deserializeStaticState(stream);
    		}
    Mais je ne vois toujours pas où est le pb.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    J'ai enlevé la sérialisation perso de la classe BranchExtension et ça fait pareil.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    En fait quand on sérialize des données, on considère qu'on prend une photo de ces données, et qu'elles ne peuvent pas changer pendant la sérialisation.

    Ton objet est toujours le même, et tu utilises le même ObjectOutputStream à chaque fois pour le sérialiser. Comme l'objet est toujours le même et qu'un objet ne change pas pendant la sérialisation, le système ne va pas le réécrire entièrement à chaque fois. Il l'écrit la première fois, et ensuite il écrit juste "c'est encore l'objet que j'ai écrit au-dessus."

    Autrement dit c'est pas fait pour faire des enregistrements périodiques des modifications avec un seul ObjectOutputStream.

    Deux solutions :
    - Avoir des objets différents à chaque enregistrement (pas glop d'après ta description)
    - Faire une nouvelle opération de sérialisation à chaque fois, autrement dit faire un nouvel ObjectOutputStream ou ObjectInputStream à chaque sauvegarde.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    Merci Thelvin pour ta réponse.

    J'ai effectivement remarqué que la taille du fichier ne change pas, qu'il y est 1 ou plusieurs objets.
    Je vais essayer de contourner le pb en rajoutant un objet primitif entre chaque BranchExtension. Ca va peut être forcer la réécriture de l'objet.

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    Et bien non ça ne marche pas !

    Ce que je ne comprends pas, c'est que cela marche avec les types primitif : on peut enregistrer plusieurs fois le même objet de type Integer en l'incrémentant à chaque fois. Et on retrouve bien tous nos objets à la relecture.

    Je continu de chercher une solution ...

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par kase74 Voir le message
    J'ai effectivement remarqué que la taille du fichier ne change pas, qu'il y est 1 ou plusieurs objets.
    Si. Mais pas beaucoup. 5 octets par nouvel objet, pour moi.

    Citation Envoyé par kase74 Voir le message
    Je vais essayer de contourner le pb en rajoutant un objet primitif entre chaque BranchExtension. Ca va peut être forcer la réécriture de l'objet.

    Et bien non ça ne marche pas !
    Normal. C'est pas de mettre quelque chose entre les deux qui va lui empêcher de dire "c'est le même objet que celui que j'ai mis là."

    Citation Envoyé par kase74 Voir le message
    Ce que je ne comprends pas, c'est que cela marche avec les types primitif : on peut enregistrer plusieurs fois le même objet de type Integer en l'incrémentant à chaque fois. Et on retrouve bien tous nos objets à la relecture.
    Les types primitifs ne sont pas des objets. Deux valeurs primitives ne peuvent donc pas être "le même objet."

    Citation Envoyé par kase74 Voir le message
    Je continu de chercher une solution ...
    Je t'en ai donné deux, dont une très bien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [SP-2010] Get-SPWebTemplate ne retrouve pas mes modèles perso
    Par diabli73 dans le forum SharePoint
    Réponses: 0
    Dernier message: 01/03/2011, 11h39
  2. Réponses: 1
    Dernier message: 06/10/2010, 14h02
  3. Je ne retrouve pas mes fichiers sur le site distant ! :-(
    Par Kosh5 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 22/11/2007, 13h21
  4. objet qui ne retrouve pas sa class
    Par trax44 dans le forum Langage
    Réponses: 9
    Dernier message: 20/07/2006, 16h33
  5. Réponses: 5
    Dernier message: 08/12/2005, 22h40

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