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 :

Problème sérialisation


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut Problème sérialisation
    bonjour, je vous demande de l'aide car je n'arrive pas à serialiser. Je cherche a faire une application simple qui consiste a mémoriser des nom de DVDs.

    classe lanceur.java :

    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
    import dvd.Dvd;
    import dvd.GestionDvd;
     
     
    public class lanceur {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		GestionDvd gestion = new GestionDvd();
    		Dvd dvd = new Dvd("titan", "action", "/local/image.jpg", "ce film raconte la guerre des titans");
    		Dvd dvd2 = new Dvd("terminator", "science fiction", "/local/terminator.jpg", "john conor doit sauver sa vie face à des terminators...");
    		System.out.println("titre dvd : "+dvd.getTitreDvd());
    		gestion.ajouterDvd(dvd);
    		gestion.ajouterDvd(dvd2);
    		//gestion.voirListDvd();
     
    	}
     
    }
    Classe GestionDvd :
    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
    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
    package dvd;
     
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.ArrayList;
     
    public class GestionDvd implements Serializable{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	ArrayList<Dvd> listDvd = new ArrayList<Dvd>();
    	public void ajouterDvd(Dvd dvd){
    		listDvd.add(dvd);
    		try {
    			FileOutputStream fichier = new FileOutputStream("Dvd.ser");
    			ObjectOutputStream oos = new ObjectOutputStream(fichier);
    			oos.writeObject(listDvd);
    			oos.flush();
    			oos.close();
    		}
    		catch (java.io.IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public void supprimerDvd(Dvd dvd){
    		boolean resultat = false;
    		resultat = listDvd.remove(dvd);
    		if(resultat == true){
    			System.out.println("dvd"+dvd.getTitreDvd()+" supprimer avec succès");
    			try {
    				FileOutputStream fichier = new FileOutputStream("Dvd.ser");
    				ObjectOutputStream oos = new ObjectOutputStream(fichier);
    				oos.writeObject(listDvd);
    				oos.flush();
    				oos.close();
    			}
    			catch (java.io.IOException e) {
    				e.printStackTrace();
    			}
    		}else{
    			System.out.println("dvd"+dvd.getTitreDvd()+" non trouvé ou non présent");
    		}
    	}
     
    	public void voirListDvd(){
    		for(int i=0;i<listDvd.size();i++){
    			System.out.println("dvd "+i+" "+listDvd.get(i).getTitreDvd());
    			System.out.println("dvd "+i+" "+listDvd.get(i).getDescriptifDvd());
    			System.out.println("dvd "+i+" "+listDvd.get(i).getStyleDuDvd());
    			System.out.println("dvd "+i+" "+listDvd.get(i).getImageDuDvd());
    		}
     
    		try {
    			FileInputStream fichier = new FileInputStream("Dvd.ser");
    			ObjectInputStream ois = new ObjectInputStream(fichier);
    			Dvd dvd = (Dvd) ois.readObject();
    			System.out.println("dvd "+dvd.getTitreDvd());
    			System.out.println("dvd "+dvd.getDescriptifDvd());
    			System.out.println("dvd "+dvd.getStyleDuDvd());
    			System.out.println("dvd "+dvd.getImageDuDvd());
    			ois.close();
    		}
    		catch (java.io.IOException e) {
    			e.printStackTrace();
    		}
    		catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    }
    Classe DVD :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    package dvd;
     
    public class Dvd {
    	private String titreDvd;
    	private String styleDuDvd;
    	private String imageDuDvd;
    	private String descriptifDvd;
     
    	public Dvd(String titreDvd, String styleDuDvd, String imageDuDvd, String descriptifDvd) {
    		this.titreDvd = titreDvd;
    		this.styleDuDvd = styleDuDvd;
    		this.imageDuDvd = imageDuDvd;
    		this.descriptifDvd = descriptifDvd;
    	}
     
     
    	public String getTitreDvd() {
    		return titreDvd;
    	}
    	public void setTitreDvd(String titreDvd) {
    		this.titreDvd = titreDvd;
    	}
    	public String getStyleDuDvd() {
    		return styleDuDvd;
    	}
    	public void setStyleDuDvd(String styleDuDvd) {
    		this.styleDuDvd = styleDuDvd;
    	}
    	public String getImageDuDvd() {
    		return imageDuDvd;
    	}
    	public void setImageDuDvd(String imageDuDvd) {
    		this.imageDuDvd = imageDuDvd;
    	}
    	public String getDescriptifDvd() {
    		return descriptifDvd;
    	}
    	public void setDescriptifDvd(String descriptifDvd) {
    		this.descriptifDvd = descriptifDvd;
    	}
    }
    et j'ai ça comme erreur :

    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
    23
    24
    25
    titre dvd : titan
    java.io.NotSerializableException: dvd.Dvd
    	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181)
    	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    	at java.util.ArrayList.writeObject(ArrayList.java:710)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:606)
    	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
    	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429)
    	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1175)
    	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    	at dvd.GestionDvd.ajouterDvd(GestionDvd.java:22)
    	at lanceur.main(lanceur.java:16)
    java.io.NotSerializableException: dvd.Dvd
    	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1181)
    	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    	at java.util.ArrayList.writeObject(ArrayList.java:710)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:606)
    	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Quand tu écris (à la ligne 22 de ton deuxième code):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oos.writeObject(listDvd);
    cela signifie que tu sérialises la liste passée en argument. La sérialisation de cette liste, sérialise, entre autres, les éléments qui sont dans cette liste, donc des instances de classe Dvd, classe qui doit donc elle aussi sérialisable, ce qui n'est pas le cas, d'où l'erreur que tu obtiens.

    Pour sauvegarder des données dans des fichiers, ce n'est pas une bonne idée d'utiliser la sérialisation. Elle n'est pas vraiment faite pour ça, mais plutôt pour des échanges entre systèmes (en réseau par exemple). Elle a pour contrainte, entre autres, que la version des classes doivent ne pas varier, entre une sérialisation et une désérialisation : si tu rendais Dvd sérialisable, et que tu voulais par la suite ajouter des nouvelles informations dans cette classe, tu ne pourrais plus charger tes données, ce qui serait ennuyeux, à priori.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par joel.drigo Voir le message
    Elle a pour contrainte, entre autres, que la version des classes doivent ne pas varier, entre une sérialisation et une désérialisation : si tu rendais Dvd sérialisable, et que tu voulais par la suite ajouter des nouvelles informations dans cette classe, tu ne pourrais plus charger tes données, ce qui serait ennuyeux, à priori.
    Il est possible de gérer cela... mais c'est assez casse-gueule et je le déconseillerais aussi.


    En plus les fichiers de sérialisation ne sont pas "éditable", ce qui peut empêcher toute migration vers un autre format (ou en tout cas la rendre plus complexe).



    Il serait plus judicieux de passer à un format "texte", comme du CSV, du JSON ou du XML.
    Quitte à le compresser par la suite en GZIP ou ZIP...



    Au passage quelques remarques sur le code :
    • Le code de sauvegarde est dupliqué ! crée une méthode private que tu appelleras au lieu de répéter le code !
    • Se contenter d'afficher l'exception est très dangereux.
      Si on n'a pas accès aux logs pendant l'utilisation on risque de passer à coté du problème... et perdre tout son boulot !
    • De même il est préférable de fermer proprement les ressources, via un try/finally ou le try-with-ressource de Java 7.
      Surtout que ton programme risque d'effectuer plusieurs écritures...




    De plus perso je n'effectuerais pas l'écriture dans le fichier à chaque modification. Cela peut être très couteux si tu ajoutes beaucoup de données...
    Il vaut mieux séparer la modification des données et la sauvegarde.


    a++

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    ok je prends note de vos réponses, je vais modifier en conséquence.

    Merci encore les amis

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

Discussions similaires

  1. [Débutant] Problème Sérialisation/Désérialisation
    Par sorry60 dans le forum Silverlight
    Réponses: 29
    Dernier message: 25/06/2010, 11h34
  2. Problème sérialisation arraylist Axis sous éclipse
    Par toprider dans le forum Services Web
    Réponses: 5
    Dernier message: 24/12/2009, 17h38
  3. Problème Sérialisation incompréhensible
    Par soft0613 dans le forum Langage
    Réponses: 2
    Dernier message: 28/06/2008, 14h42
  4. Problème sérialisation XML [C#]
    Par AlphonseBrown dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/04/2006, 22h58

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