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

Persistance des données Java Discussion :

Serializable + classe contenant tableau d'objet


Sujet :

Persistance des données Java

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut Serializable + classe contenant tableau d'objet
    Bonjour à tous,

    Alors voilà mon soucis.

    J'ai une première classe
    Code java : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    package classes;
     
    import MyExceptions.DateException;
    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Calendar;
     
    /**
     *
     * @author threis raphael
     */
    public class cPrestation implements Serializable{
     
        // <editor-fold desc="Variables" defaultstate="collapsed">
        private int iMois;
        private int iAnnee;
        private cJournee[] cjJours;
        private int iIdOuvrier;
        private String sNom;
        private String sPrenom;
        // </editor-fold>
     
        // <editor-fold desc="Constructeurs" defaultstate="collapsed">
        /**
         * Constructeur par défaut
         */
        public cPrestation() {
            iMois = 0;
            iAnnee = 0;
            iIdOuvrier = 0;
            sNom = "";
            sPrenom = "";
        }
     
        /**
         * Initialise les prestations du mois pour l'ouvrier
         * @param iId       Identifiant de l'ouvrier.
         * @param Nom       Nom de l'ouvrier.
         * @param Prenom    Prénom de l'ouvrier
         */
        public cPrestation(int iId, String Nom, String Prenom){
            this.iIdOuvrier = iId;
            this.sNom = Nom;
            this.sPrenom = Prenom;
        }
        // </editor-fold>
     
        // <editor-fold desc="Setter et Getter" defaultstate="collapsed">
        public cJournee[] getCjJours() {
            return cjJours;
        }
     
        /**
         * Initialise le tableau des jours du mois avec le nombre de jours du mois.
         */
        private void setCjJours() throws DateException {
            if( this.iMois >= 0 && this.iAnnee >= 0)
            {
                Calendar c = Calendar.getInstance();
                c.set(Calendar.MONTH, this.iMois);
                c.set(Calendar.YEAR, this.iAnnee);
                c.set(Calendar.DAY_OF_MONTH, 1);
                int nbJours = c.getActualMaximum(Calendar.DAY_OF_MONTH);
                cjJours = new cJournee[nbJours];
            }
            else if(this.iMois<1){
                throw new DateException("Le mois est incohérent !");
            }
            else if(this.iAnnee<1){
                throw new DateException("L'année est incohérente !");
            }
        }
     
        public int getAnnee() {
            return iAnnee;
        }
     
        public void setAnnee(int iAnnee) {
            this.iAnnee = iAnnee;
            try{
                setCjJours();
            }
            catch(DateException de){
                System.out.println(de.getMessage());
            }
        }
     
        public int getMois() {
            return iMois;
        }
     
        public void setMois(int iMois) {
            this.iMois = iMois;
            try{
                setCjJours();
            }
            catch(DateException de){
                System.out.println(de.getMessage());
            }
        }
     
        public int getIdOuvrier() {
            return iIdOuvrier;
        }
     
        public void setIdOuvrier(int idOuvrier) {
            this.iIdOuvrier = idOuvrier;
        }
     
        public String getNom() {
            return sNom;
        }
     
        public void setNom(String sNom) {
            this.sNom = sNom;
        }
     
        public String getPrenom() {
            return sPrenom;
        }
     
        public void setPrenom(String sPrenom) {
            this.sPrenom = sPrenom;
        }
        // </editor-fold>
     
        /**
         *
         * @return boolean  true si élément sauver avec succès
         *                  false si une erreur est survenue
         */
        public boolean save(){
            try{
                FileOutputStream fileOut = new FileOutputStream("c:\\deneigement\\"+iIdOuvrier+"-"+iAnnee+"-"+iMois+".ser");
                ObjectOutputStream out = new ObjectOutputStream(fileOut);
                out.writeObject(this);
                out.close();
                fileOut.close();
            }
            catch(Exception e){
                System.out.println("Erreur:"+e.getMessage());
                return false;
            }
            return true;
        }
     
        public void setPrestation(float[] pPrestation){
     
        }
    }
    Vous voyez que cette première, contient un vecteur d'objets cJournee que voici :
    Code JAVA : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    package classes;
     
    import java.io.Serializable;
     
    /**
     * Classe contenant les informations d'une journée de prestation
     * Contient un tableau des heures prestées pour chaque tranche horaire
     * @author threis raphael
     */
    public class cJournee implements Serializable{
     
        private float[] fHeures;
        private String[] sFourchette;
        private float[] fCoef;
     
        /**
         * Construit l'objet cJournee avec les informations de tranche horaire du
         * fichier de configuration, avec autant de tranches horaires que requises.
         */
        public cJournee(){
            this.fHeures = new float[deneigement.Deneigement.config.getLength()];
            this.sFourchette = new String[deneigement.Deneigement.config.getLength()];
            for (int i = 0; i < deneigement.Deneigement.config.getLength(); i++){
                this.sFourchette[i] = deneigement.Deneigement.config.getHoraire(i).getFourchette();
                this.fCoef[i] = deneigement.Deneigement.config.getHoraire(i).getCoefficient();
            }
        }
     
        /**
         * Construit l'objet cJournee avec autant de tranche horaire que spécifiées
         * en paramètres (p.ex.: 1 pour le dimanche avec un coef de 2)
         * @param nbHoraire     Nombre de tranche horaire si différente de la valeur par
         *                      défaut
         * @param pFourchette   Toutes les fourchettes horaires requises pour la journée en question
         * @param pCoef         Coefficient pour toutes les fourchettes horaires
         */
        public cJournee(int nbHoraire, String[] pFourchette, float[] pCoef){
            this.fHeures = new float[nbHoraire];
            this.sFourchette = pFourchette;
            this.fCoef = pCoef;
        }
     
        /**
         * Méthode retournant le nombre d'heures prestées pour la tranche horaire spécifiée
         * @param Horaire   tranche horaire (p.ex. : 6h-8h)
         * @return float    nombre d'heures prestées
         */
        public float getHeures(int Horaire){
            return fHeures[Horaire];
        }
     
        /**
         * Méthode initialisant le nombre d'heure pour une tranche horaire
         * @param Horaire   indice de l'heure
         * @param Value     nombre d'heure prestées
         */
        public void setHeures(int Horaire, float Value){
            this.fHeures[Horaire] = Value;
        }
    }

    Lorsque je sauve mes objets cPrestations, je souhaiterais que le vecteur de cJournee soit également sauvé, hors ce n'est pas le cas.
    Pourtant, chacune des deux classes disposent des implements de Serializable, ce qui devrait les faire se sauver non?

    Je souhaite en fait, disposer d'un fichier contenant toutes informations de mon objet Prestation.

    En vous remerciant pour l'aide que vous pourrez m'accorder, je vous souhaite à tous, une bonne journée.
    First step: F.A.Q.
    Second step: Forum -> Recherche
    Thrid step: Forum -> Poser une question
    Fourth step: Forum -> Attendre une réponse
    Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

    Simple non ? l'utilisation de developpez.com

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un tableau, pas un vecteur

    Ceci dit, qu'est-ce qui te fait dire que les cjournee ne sont pas sauvés?

    PS: tu devrais respecter les conventions java dans la notation des nom de classe: UpperCamelCase :-)

  3. #3
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    tu peux montrer le code où tu essayes de les 'sauver' ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  4. #4
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Voici l'appel que je fais de ma méthode save() se trouvant dans la classe cPrestation.

    Code java : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
        private void jbSaveActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            String[] splitted = jcbOuvriers.getSelectedItem().toString().split(" ");
            int idOuvrier = Integer.parseInt(splitted[0]);
            String sAnnee = jcbAnnee.getSelectedItem().toString();
            int iMois = jcbMois.getSelectedIndex()+1;
     
            cPrestation cpPresta = new cPrestation(idOuvrier, splitted[1], splitted[2]);
            cpPresta.setAnnee(Integer.parseInt(sAnnee));
            cpPresta.setMois(iMois);
     
            TableModel model = jtPrestation.getModel();
            int nbLigne = model.getRowCount();
     
            float[] fPrestation;
            for(int iLigne = 0; iLigne < nbLigne; iLigne++){
                int nbColonne = model.getColumnCount();
                fPrestation = new float[nbColonne];
                for( int iColonne = 1; iColonne < nbColonne; iColonne++){
                    try{
                        if( model.getValueAt(iLigne, iColonne) != "" ){
                            splitted = model.getValueAt(iLigne, iColonne).toString().split(":");
                            fPrestation[iColonne-1] = Float.parseFloat(splitted[0])+(Float.parseFloat(splitted[1])/60);
                            cpPresta.setPrestation(fPrestation);
                        }
                    }
                    catch( NullPointerException npe){
                        System.out.println("Erreur: "+npe.getMessage());
                        iColonne = nbColonne;
                    }
                }
            }
     
            if( !cpPresta.save()){
                JOptionPane.showMessageDialog(this, "Erreur lors de la sauvegarde des heures.\nVeuillez réessayer.", "Erreur", JOptionPane.ERROR_MESSAGE);
            }
            else{
                this.dispose();
            }
        }

    Et voici la méthode save() de ma classe cPrestation
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public boolean save(){
        try{
            FileOutputStream fileOut = new FileOutputStream("c:\\deneigement\\"+iIdOuvrier+"-"+iAnnee+"-"+iMois+".ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(this);
            out.close();
            fileOut.close();
        }
        catch(Exception e){
            System.out.println("Erreur:"+e.getMessage());
            return false;
        }
        return true;
    }
    Fichiers attachés Fichiers attachés
    First step: F.A.Q.
    Second step: Forum -> Recherche
    Thrid step: Forum -> Poser une question
    Fourth step: Forum -> Attendre une réponse
    Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

    Simple non ? l'utilisation de developpez.com

  5. #5
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    PS: tu devrais respecter les conventions java dans la notation des nom de classe: UpperCamelCase :-)
    En fait, la norme que j'utilise n'est surement mentionnée nulle part, mais, étant donné que dans la majorité des projets, je suis le seul développeur, cela m'a toujours très bien convenu.

    si par exemple un variable se nomme jbSave, il s'agit d'un jButton utiliser pour sauver. un jtfNom sera un JTextField contenant le nom et un jlNom le label correspondant.
    Je sais pour la création de mes classes qu'il faut faire commencer le nom de cette dernière par une majuscule (même l'IDE, à savoir NetBeans le conseil).
    First step: F.A.Q.
    Second step: Forum -> Recherche
    Thrid step: Forum -> Poser une question
    Fourth step: Forum -> Attendre une réponse
    Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

    Simple non ? l'utilisation de developpez.com

  6. #6
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    dans la méthode où tu appelles le save, quand est-ce que tu utilises les cJournee ?
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  7. #7
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Ligne 137 de ma classe CPrestation :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    out.writeObject(this);
    Cette instructions va bien sauver mon objet non ? Etant donné que mon objet contient un tableau d'autres objets, ces derniers, se trouvant dans le tableau donc, devraient être sauvés aussi non ?

    A mon avis, je loupe un épisode... mais le tout est de savoir lequel...
    First step: F.A.Q.
    Second step: Forum -> Recherche
    Thrid step: Forum -> Poser une question
    Fourth step: Forum -> Attendre une réponse
    Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

    Simple non ? l'utilisation de developpez.com

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu n'as toujours pas répondu à la question: qu'est-ce qui te fait croire que ce n'est pas sauvé? De plus, effectivement, nulle part dans ton code tu ne donne de valeur à mettre dans le tableau. Donc tu sauve un tableau plein de nulls

  9. #9
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Mouais, la pièce vient de tomber.

    En fait, il me manque la méthode setPrestation qui n'est pas encore complétée...
    First step: F.A.Q.
    Second step: Forum -> Recherche
    Thrid step: Forum -> Poser une question
    Fourth step: Forum -> Attendre une réponse
    Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

    Simple non ? l'utilisation de developpez.com

Discussions similaires

  1. Mapping d'une classe contenant un attribut objet
    Par sadro dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/05/2013, 11h32
  2. Réponses: 7
    Dernier message: 04/01/2013, 16h25
  3. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52
  4. Réponses: 10
    Dernier message: 10/01/2006, 14h14

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