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

avec Java Discussion :

Instance DAO corrompue (ObjectStream)


Sujet :

avec Java

  1. #1
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut Instance DAO corrompue (ObjectStream)
    Bonjour,

    Je me permet de vous faire part d'un problème qui me coûte une quantitée considérable de cheveux

    Voilà j'ai deux applications relié par un Socket. J'ai pour intention de les faire communiquer uniquement au travers d'ObjectStream.
    Lorsque je fias passé un objet sérialisé dans le flux tous marche a merveille (que ca soit la sérialization comme la désérialization).
    Le problème c'est que lorsque j'envoit deux instances l'une derrière l'autre, un exception me signalant une corruption m'agresse violament !

    Sérialisation :
    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
                BufferedOutputStream bos = new BufferedOutputStream(cs.getOutputStream());
                oos = new ObjectOutputStream(bos);
                service = new Service();
                System.out.println(service);
                service.setCode(1);
                service.setObject(null);
                oos.writeObject(service);
                oos.flush();
     
                // jusque là tout marche
                service = new Service();
                System.out.println(service);
                service.setCode(1);
                service.setObject(null);
                oos.writeObject(service);
                oos.flush();
    Désérialization :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    si = (ServiceInterface) DAOClass.SERVICE.getInstance(is);
                    System.out.println(si.getCode());
     
                    // Jusque là, la désérialisation se passe bien
                    si = (ServiceInterface) DAOClass.SERVICE.getInstance(is);
                    System.out.println(si.getCode());
    Exception :
    SEVERE: null
    java.io.StreamCorruptedException: invalid stream header: 7371007E
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
    at dao.CustomObjectInputStream.<init>(CustomObjectInputStream.java:22)
    at dao.DAOClass.getInstance(DAOClass.java:66)
    at mtransportclient.Main.main(Main.java:47)
    Java Result: 1
    Ne peut peut hélas pas montrer le code qui se charge directement de la désérialisation (enfin si je peux mais ca va plus embrouiller qu'autre chose, elle désérialize simplement un flux au travers d'un class loader spécifique).
    J'ai tenté d'appeler la méthode reset() sur les OutputStream, mais sans succès. J'ai aussi tenté sans BufferedStream, mais c'est la même chose.

    Une idée ?

    Merci d'avance !
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    J'avais eu le même genre de soucis quand j'avais fais une application client serveur en Java. En fait si tu envois à la suite deux données sur le même socket, à la lecture lors de la désérialisation, l'application essaie de convertir l'ensemble des données et de les affectées à la classe voulue et elle ne comprends pas qu'il s'agit de deux instances de classes en réalité.

    Deux solutions... ouvrir un nouveau socket sur un autre port ce qui est plutôt lourd, ou faire communiquer les le client et le serveur.

    Tu fait un thread d'écoute de socket sur le client et le serveur

    1 Le serveur envoie la première instance de la classe et bloque l'envoie sur le socket

    2 le thread qui écoute sur le client détecte le flux de donnée et tu lui dis que le flux de donnée correspond à une instance de classe Service.

    3 Une fois les données reçu, le client envois un message au serveur. Un int suffit genre "1"

    4 le thread d'écoute de socket sur le serveur va détecter qu'il reçoit quelque chose, tu luis dis de le convertir en int, et si c'est possible de le convertir, tu regarde si le nombre reçu est bien 1. La tu déclanche si nécessaire l'envois d'un nouveau "Service".


    Une autre solution moins propre à mon gout serait je penses de mettre un temps de pause entre l'envoie de deux instances de classe service.

    Tu envois la première instance, tu fait attendre le (par exemple 2s) avant l'envoie de la seconde

    J'espère que j'ai pas répondu trop à coté et que ac t'aidera.

    Bonne journée

    Flo

Discussions similaires

  1. Instance Users DAO
    Par clems_t dans le forum Persistance des données
    Réponses: 4
    Dernier message: 30/11/2014, 13h43
  2. [Data] Faire appel à l'instance d'un DAO
    Par Johnbob dans le forum Spring
    Réponses: 5
    Dernier message: 30/05/2009, 13h47
  3. [VB6] [DLL] DLL à instance unique
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/09/2003, 08h07
  4. [VB6]Passer le focus à une instance précedente
    Par Jeremiah dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 16/09/2003, 10h01
  5. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56

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