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

Entrée/Sortie Java Discussion :

Problème de sérialisation


Sujet :

Entrée/Sortie Java

  1. #1
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut Problème de sérialisation
    Je dois faire une communication entre une applet et une servlet, j'ai donc créé une classe transmission qui est sérialisable.
    Seulement au moment de la création de l'objectInputStream dans l'applet j'ai une exception : java.io.StreamCorruptedException : invalid stream header.
    J'ai tenté de mettre en commentaire le buffer d'écriture (ObjectOutputStream), pour voir si c'était interdit d'avoir 2 stream, mais l'erreur est toujours là.

    Je ne vois pas où peut être l'erreur, merci d'avance pour votre aide.

    Voila mon code (la ligne d'erreur est au milieu) :
    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
    URLConnection connexion = null;
    		TransmissionReponse transReponse = null;
    		try{	
    		    urlServlet = new URL("http://adresseServlet");
    			connexion = urlServlet.openConnection();
    			connexion.setDoOutput(true);
     
    			//récupération du loginNT de la personne
    			String strLoginNT = System.getProperty("user.name");
     
    			//transmission de la requete
    		    ObjectOutputStream bufferEcriture = new ObjectOutputStream(connexion.getOutputStream());
    		    TransmissionRequete transRequete = null;
    		    transRequete = new TransmissionRequete("AUTH", "SELECT * FROM UTILISATEURS WHERE LoginNT='"+strLoginNT+"'", (String)(this.ihm.getFrame().getPnlAuthentification()).getListeBases().getSelectedValue());
    		    bufferEcriture.writeObject(transRequete);
     
    		    //reception de la réponse
    		    ObjectInputStream bufferLecture = new ObjectInputStream(connexion.getInputStream()); //ERREUR ICI
    		    transReponse = (TransmissionReponse)bufferLecture.readObject();
     
    			//vérification de l'absence d'erreur
    			if (transReponse.getMessage().equals("OK")==false){
    			    JOptionPane.showMessageDialog(this.getIhm().getFrame(), transReponse.getMessage().toString(), "Erreur", JOptionPane.ERROR_MESSAGE);
    			}
     
    			//vérification que le nom était dans la base
     
    			return true;
    		}
    		catch(IOException erreur){
    			JOptionPane.showMessageDialog(this.getIhm().getFrame(), erreur.toString(), "Erreur", JOptionPane.ERROR_MESSAGE);
    			return false;
    		} catch (ClassNotFoundException erreur) {
    		    JOptionPane.showMessageDialog(this.getIhm().getFrame(), erreur.toString(), "Erreur", JOptionPane.ERROR_MESSAGE);
    		    return false;
    		}

  2. #2
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Ce type d'erreur est classique d'une version de classe différente. Verifie que ton applet possede bien la même version de la classe que ta servlet.

  3. #3
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Merci pour la réponse, j'ai vérifié et effectivement j'avais une différence de version.
    Mais j'ai toujours l'erreur, ce que je trouve bizarre c'est qu'elle apparait à la création du flux, même si je mets tout le reste en commentaire, sans écrire dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectInputStream bufferLecture = new ObjectInputStream(connexion.getInputStream());

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Personne n'a d'avis sur la question? en admettant que j'ai encore une différence de version entre les classes de transmission de l'applet et de la servlet, est-ce normal que même si je ne m'en sers pas, je n'envoi aucune donnée, l'erreur apparaisse?
    Les classes sont vérifiées au moment de la création du flux d'échange et pas à l'envoi/réception?

  5. #5
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    J'ai peut-être trouvé d'où vient mon problème.
    En fait j'ai créé 2 projets dans Eclipse, un pour l'applet et un autre pour la servlet. J'ai créé dans chacun des 2 projets une classe Transmission, elles sont donc identiques au niveau du contenu mais ce sont 2 fichiers différents.
    Alors est-ce que le problème pourrait venir de là? comment dois-je faire pour inclure le même fichier Transmission.class aux 2 projets?

    Ce problème est totalement bloquant pour mon projet, et personne dans mon entreprise n'a de compétences en java, donc toute aide est la bienvenue

  6. #6
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Personne n'a fait d'applet/servlet communiquant avec une classe sérialisable? comment avez-vous inclus votre classe dans vos 2 projets?
    ChristopheJ?

  7. #7
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par morph41
    (...) En fait j'ai créé 2 projets dans Eclipse, un pour l'applet et un autre pour la servlet. J'ai créé dans chacun des 2 projets une classe Transmission, elles sont donc identiques au niveau du contenu mais ce sont 2 fichiers différents.
    Je ne suis pas très fort en sérialisation, mais ça pourrait bien venir de là en effet.
    Tu devrais utiliser une seule classe. Pour ce faire, tu mets ta classe Transmission dans un .jar et tu utilises ce .jar dans tes 2 projets.

    En plus, ça facilitera grandement la maintenance de tes projets. Définir 2 fois la même classe ne peut que t'attirer des ennuis. Il faut à tout prix éviter de dupliquer du code !

  8. #8
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Merci d'avoir répondu!
    J'ai essayé d'utiliser un fichier jar, et j'ai des soucis pour l'importer à mon projet...mais je persévère dans cette voie.

  9. #9
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    j'ai des soucis pour l'importer à mon projet
    Quoi comme soucis ? Si tu es sous Eclipse, ça se fait (presque) tout seul !

  10. #10
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Merci pour ton aide NGY, c'est bon, en fait j'ai ajouter le fichier jar aux 2 projets.
    Mais j'ai toujours l'erreur : java.io.StreamCorruptedException: invalid stream header
    Je commence à être à cours d'idée et la date de fin de mon prjet approche

    Je remets le code que j'ai modifié :

    APPLET :

    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
    public Client(){
    	    //initialisation de la connexion
    		try {
                urlServlet = new URL("http://intranet:8080/PlanifAutoServlet");
                connexion = urlServlet.openConnection();
                connexion.setDoOutput(true);
            } catch (MalformedURLException e) {
                e.printStackTrace();
                System.exit(0);
            } catch (IOException e1) {
                e1.printStackTrace();
                System.exit(0);
            }		
     
    		//initialisation des flux d'entrée/sortie
            try {
                bufferEcriture = new ObjectOutputStream(connexion.getOutputStream());
                bufferLecture = new ObjectInputStream(connexion.getInputStream());
            } catch (IOException e2) {
                e2.printStackTrace();
                System.exit(0);
            }
    	}
    SERVLET :

    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
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
    		throws IOException, ServletException{
     
    	    //création de l'objet qu'on va renvoyer
    	    TransmissionReponse transReponse = null;
     
    	    try {
    			//lecture de la requète
    			ObjectInputStream bufferLecture = new ObjectInputStream(request.getInputStream());
    			TransmissionRequete transRequete = (TransmissionRequete)bufferLecture.readObject();
     
    			//chargement du driver jdbc
    			Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    			//création de la connexion à la base de données	
    		    connexionDB = DriverManager.getConnection(strServeur, strLoginBase, strMDPBase);
    		    //création de l'instruction
    			Statement instruction = connexionDB.createStatement();
     
    			//analyse de la transmission et envoi de la requete
    			String strMessage = transRequete.getMessage();
    			if (strMessage.equals("MAJ")){
    			    instruction.executeUpdate(transRequete.getRequete());
    			    transReponse = new TransmissionReponse("OK", null);
    			}
    			else if (strMessage.equals("SELECT")){
    			    ResultSet rstResultSet = instruction.executeQuery(transRequete.getRequete());
    			    transReponse = new TransmissionReponse("OK", rstResultSet);
    			    rstResultSet.close();
    			}
    			else{
    			    transReponse = new TransmissionReponse("Analyse du message impossible", null);
    			}			
    		} catch (ClassNotFoundException e) {
    		    transReponse = new TransmissionReponse(e.toString(), null);
    		} catch (SQLException e) {
    		    transReponse = new TransmissionReponse(e.toString(), null);
    		} finally {
    		    //envoi de l'objet réponse
    		    ObjectOutputStream bufferEcriture = new ObjectOutputStream(response.getOutputStream());
    		    bufferEcriture.writeObject(transReponse);
    		}
    	}

  11. #11
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Je dois avouer que je ne vois pas trop.

    Ta classe Transmission ne contient bien que des objets sérialisables au moins ?
    Peux-tu montrer la liste de ses attributs.

  12. #12
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Peut-être est-ce un problème de serialVersionID ? Est-ce que tu l'as défini explicitement ? Il me semble que si tu ne le fais pas, la JVM en génère un. Peut-être que ça vient de là ?

    Essaie d'ajouter ça dans ta classe sérializabel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final long serialVersionUID = 7551206773280933960L;
    (le nombre lui-même importe peu...)
    Wookai


  13. #13
    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 Wookai
    Peut-être est-ce un problème de serialVersionID ? Est-ce que tu l'as défini explicitement ? Il me semble que si tu ne le fais pas, la JVM en génère un. Peut-être que ça vient de là ?

    Essaie d'ajouter ça dans ta classe sérializabel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final long serialVersionUID = 7551206773280933960L;
    (le nombre lui-même importe peu...)
    Il est vrai qu'il est fortement recommandé de définir soit même le serialVersionUID (cf Serializable), cependant une erreur sur le serialVersionUID génère plutôt une InvalidClassException (mais ça ne coute rien de le rajouter, on sait jamais).
    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

  14. #14
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Ma classe transmission ne contient que quelques String et un ResulSet, donc pas de problème c'est sérialisable. (enfin je crois pour le ResultSet)

    Par contre je ne connaissais pas le serialVersionUID, je vais essayer ça tout de suite.

  15. #15
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par morph41
    Ma classe transmission ne contient que quelques String et un ResulSet, donc pas de problème c'est sérialisable. (enfin je crois pour le ResultSet)
    Alors là, je n'en suis pas si sûr
    Il faut vérifier ça avec la doc de ton driver, mais je n'y crois pas trop.

    En plus, pourquoi ta classe contient elle un ResultSet ?
    Si c'est pour passer des résultats de requête, il faut les recopier dans une Collection ou bien utiliser un RowSet (que je ne connais pas).
    Un ResultSet ne doit pas servir à faire transiter des données d'une classe à l'autre !

  16. #16
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    La classe contient un ResultSet pour transférer le resultat d'une requète exécutée par la servlet vers l'applet.
    Après je peux manipuler facilement le résultat dans l'applet.
    J'utilise la classe qui est dans java.sql.ResultSet, et elle est sérialisable.

    Mais l'erreur est à ce niveau, donc la classe transmission n'est pas encore utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bufferEcriture = new ObjectOutputStream(connexion.getOutputStream()); //ça passe sans problème
                bufferLecture = new ObjectInputStream(connexion.getInputStream()); //ERREUR
    On peut bien utiliser un ObjectInputStream sur une connexion applet/servlet en utilisant la méthode DoPost?

  17. #17
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Bon je ne vois pas trop et comme je n'ai jamais essayé ce genre de manip' j'ai pas beaucoup d'idées.
    • Es-tu sûr que tes 2 applis (Servlet et Applet) disposent de la même classe (le jar est bien accessible pour chacun d'eux) ;
      Es-tu sûr que ça ne vient pas du ResultSet ? (essaie de le retirer de la classe juste pour voir)
      Et aussi, n'y a t-il pas un problème de sécurité ? En effet je ne suis pas sûr qu'une applet puisse envoyer et recevoir des données comme elle le souhaite.

    Enfin, si quelqu'un a une autre piste ...

    On peut bien utiliser un ObjectInputStream sur une connexion applet/servlet en utilisant la méthode DoPost?
    Ben, justement, je ne sais pas trop (cf. sécurité dans les applets).

  18. #18
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Pour le fichier jar, je l'ai ajouté aux 2 projets dans les propriétés Java Build Path.
    Je viens de tester sans ResultSet, ça ne marche toujours pas.
    En ce qui concerne la sécurité, je pense que ça ne pose pas de problème, je l'ai vu dans plusieurs exemples

  19. #19
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    J'ai réglé le problème, apparemment un soucis dans le contexte de la servlet.
    Merci pour votre aide

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

Discussions similaires

  1. [Tableaux] problème de sérialisation
    Par mikebranque dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2007, 19h52
  2. [Tableaux] Problème de sérialisation
    Par Langly dans le forum Langage
    Réponses: 1
    Dernier message: 29/12/2006, 20h22
  3. [Débutant] Problème de sérialisation collection
    Par Michel Hubert dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 21/12/2006, 15h17
  4. problème de sérialisation
    Par yoyomc dans le forum Langage
    Réponses: 5
    Dernier message: 17/12/2006, 23h02
  5. Réponses: 4
    Dernier message: 12/12/2006, 10h22

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