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

Langage Java Discussion :

Sérialisation d'objet et envoi par le réseau


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Par défaut Sérialisation d'objet et envoi par le réseau
    Bonsoir,

    Je vous présente la solution que j'essaie d'implémenter:

    Celle ci requiert 3 applications que je vais nommer A, B et C.

    L'application A qui construit un objet et le sérialise sous forme de fichier (nommons le "obj.ser").

    On copie alors ce fichier obj.ser vers un dossier de l'application B. Celle ci, est un serveur (codé en C) qui doit permettre l'envoi par le réseau du fichier obj.ser.

    L'application C reçoit le fichier obj.ser, et reconstitue l'objet depuis le fichier.

    Cependant, l'erreur suivante survient lorsque je veux reconstituer mon objet depuis le fichier (dans l'application C, après avoir reçu le fichier depuis le réseau) :

    Une StreamCorruptedException est levée (invalid type code: 00) lors de l'appel à la méthode readObject() de l'objet ObjectInputStream.

    Voici le code des méthodes de sérialisation/déserialisation :

    Sérialisation
    (Utilisée par l'application A)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    static public void SERDataModel(String filename, PCADataModel m) throws SerializationException {
            try {
                FileOutputStream fOS = new FileOutputStream(filename);
                ObjectOutputStream oOS = new ObjectOutputStream(fOS);
                oOS.writeObject(m);
                oOS.close();
                fOS.close();
            } catch (FileNotFoundException ex) {
                throw new SerializationException(ex.getMessage());
            } catch (IOException ex) {
                throw new SerializationException(ex.getMessage());
            }
        }
    Déserialisation
    (Utilisée par l'application C)
    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
     
    static public PCADataModel unSERDataModel(String filename) throws SerializationException {
            PCADataModel model = null;
            try {
                FileInputStream fIS = new FileInputStream(filename);
                ObjectInputStream oIS = new ObjectInputStream(fIS);
                model = (PCADataModel) oIS.readObject();
                oIS.close();
                fIS.close();
                return (model);
            } catch (StreamCorruptedException ex) {
               //L'exception est levée ici
                throw new SerializationException(ex.getMessage());
            } catch (FileNotFoundException ex) {
                throw new SerializationException(ex);
            } catch (IOException ex) {
                throw new SerializationException(ex);
            } catch (ClassNotFoundException ex) {
                throw new SerializationException(ex);
            }
        }
    Et enfin la méthode de réception par le réseau (utilisée par l'application C)

    Network
    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
     
        private void createPCAMonitor(int dataSize) {
            byte[] buf = new byte[dataSize];
            try {
                //dis est un DataInputStream relié à la socket
                dis.readFully(buf);
                FileOutputStream fos = new FileOutputStream("obj.ser");
                fos.write(buf);
                PCADataModel dataModel = IHMBuilder.unSERDataModel("obj.ser");
                SwingUtilities.invokeLater(new IHMBuildRunnable(dataModel));
            } catch (IOException ex) {
                LogManager.write(LogManager.LogType.NETWORK, ex.getMessage());
            } catch (SerializationException ex) {
                LogManager.write(LogManager.LogType.NETWORK, ex.getMessage());
            }
        }
    Je ne comprends pas le problème, j'arrive à reconstituer l'objet parfaitement sans passer par le réseau, en copiant le fichier obj.ser à la racine de l'application C et en déserialisant directement l'objet sur disque.

    Si quelqu'un à une solution à mon problème, je suis preneur.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 66
    Par défaut
    Bonjour,

    Bon je sais d'avance que je ne vais pas répondre vraiment à ton post. Mais pourquoi tu n'utilises pas RMI qui fait en fait ce que tu souhaites sans les préoccupation que tu te poses ?

    Bonne journée et bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Par défaut
    Ah j'ai oublié de préciser que le serveur (application B) est codé en C.

    Donc je ne peux pas utiliser RMI.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il faudrait qu'on en sache un peu plus sur le protocole que vous utilisez avec l'application B pour la lecture et l'ecriture? Avez vous pensé à commencer par valider votre protocole en envoyant par exemple une image pour ensuite la réceptionner? Vous verrez tout de suite si vous corrompez le fichier pendant le transfert.

  5. #5
    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,


    • Il manque les try/finally pour la libération des ressources. Pire il manque carrément des close() !!!
    • Tes SerializationException devraient englobé l'exception original, afin d'avoir un stacktrace complet.
      En clair au lieu de lui passer le message tu lui passes directement l'exception source :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      throw new SerializationException(ex);
    • Tu veux faire une copie par le réseau... Pourquoi ne pas directement lire le flux réseau via un ObjectInputStream plutôt que de faire une recopie dans un fichier en local ?
    • Dans la méthode createPCAMonitor() tu sembles utiliser un flux défini en attribut d'instance...
      Ce n'est pas très évident à gérer et cela aboutit souvent à une mauvaise gestion des ressources.
    • Comment se fait a lecture entre l'application C et Java ?



    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pire il manque carrément des close() !!!
    Tu fais bien de le signaler, en effet, a tous les coups, le deserializer désérialize un fichier dont le contenu n'a pas entèrement été écrit (FileOutputStream pas fermé donc pas flushé)

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

Discussions similaires

  1. Serialisation d'objet et envoie par socket
    Par alex8276 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 17/04/2015, 23h18
  2. Envoi par fichier ou objet serialisé ?
    Par rimas2009 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 15/07/2009, 18h19
  3. Serialisation d'objet pour envoie par UDP
    Par olator dans le forum MFC
    Réponses: 3
    Dernier message: 07/11/2008, 19h11
  4. Réponses: 2
    Dernier message: 19/09/2007, 10h21
  5. Howto - Envoi message sur réseau
    Par Thomad dans le forum Windows
    Réponses: 2
    Dernier message: 31/03/2004, 16h46

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