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

Concurrence et multi-thread Java Discussion :

Serialisation, thread et objet modifiable


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut Serialisation, thread et objet modifiable
    Bonjour,
    Je bloque actuellement sur un petit problème. J'ai un Vector de Personnes que je sérialise. Cependant, pour augmenter la vitesse d'exécution, on m'a demandé de créer un thread qui ajoute dans le fichier petit à petit (et non pas en une seule fois comme pour le moment.)

    Mon problème est que je ne vois pas comment faire pour ajouter progressivement les lignes du Vector à la serialisation. Pour moi, on sérialise un objet puis, il n'est plus modifiable une fois enregistré dans un fichier.

    Y'a-t'il malgré tout une méthode? Serais-je passé a coté de quelque chose?

    Merci pour votre aide

  2. #2
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Utilise la technique du fichier mappé, pour en augmenter la taille, il suffit d'écrire en fin de fichier.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    merci bien pour cette info, je vais voir ce que cela peut donner.

  4. #4
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Au passage si t'as moyen de changer ton Vector en Collection

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    mais Vector fait partie des collections non?
    Quel intérêt de le changer en collection? Si j'ai choisi un vector, c'est car c'est l'objet le plus rapide a l'ajout. Et comme je dois optimiser la rapidité du soft...

    J'en profite pour poser une deuxième question, est-il possible de sérialiser plusieurs objets (de mêmes instances) dans un même fichier puis de les désérialiser?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    Je suis actuellement en train d'essayer d'enregistrer mes objets ("Personnes") dans un fichier mappé mais la, je bloque aussi.

    voici ce que j'ai déja fait:

    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
     
    public void save ()
    {    
        try
        {
     
            RandomAccessFile raf = new RandomAccessFile(NOM_FICH, "rw");
            FileChannel fc = raf.getChannel();
            fc.map(MapMode.READ_WRITE, 0L, fc.size()); // je ne sais pas a quoi sert cette ligne!!!!
            ObjectOutputStream in = new ObjectOutputStream(b)
     
            for (int i=0;i<tab.size();i++)
            {
                ByteArrayOutputStream b = new ByteArrayOutputStream();
                ObjectOutputStream in = new ObjectOutputStream (b);
                in.writeObject(tab.get(i));
                raf.writeBytes(b.toString());
                in.close();
                b.close();
            }
     
        fc.close();
        raf.close();
    }
    catch (Exception e) {}[/INDENT]
    }
    Je ne sais pas du tout si cela fonctionne. Mon problème est en fait pour récupérer tous les objets que j'ai pu mettre dans ce fichier mappé. Savez vous comment faire?

    Sinon, j'ai essayé avec la sérialisation, mais la aussi, je n'arrive pas à récupérer plus d'un objet.

    voici le code de ma fonction save versions sérialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ObjectOutputStream oos = new ObjectOutptutStream (new FileOutputStream (NOM_FICH, true));
     
    for (int i=0; i<tab.size(); i++)
    {
        oos.writeObject(tab.get(i));
        nbAdded++;
    }
     
    oos.close();
    }
    Et enfin ma fonction load:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ObjectInputStream ois = Vector <Personne> v = new Vector <Personne> ();
     
    for (int i = 0;i<nbAdded;i++)
    {
        Personne p = (Personne) ois.readObject();
        v.add(p);
    }
     
    return v;
    Si vous voyez une erreur, ou si vous avez des propositions je vous en serait très reconnaisant. Merci

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    UP... please help me.
    Ca fait deux jours que je coince sur le problème. Un nouveau point vient de s'ajouter:

    Si je laisse le flux de donnée ouvert, alors je peut ajouter et lire ensuite plusieurs objet sérialisés dans un même fichier. Mais dès que ce flux est fermé, impossible de le lire.

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par yozart
    mais Vector fait partie des collections non?
    Quel intérêt de le changer en collection? Si j'ai choisi un vector, c'est car c'est l'objet le plus rapide a l'ajout. Et comme je dois optimiser la rapidité du soft...
    Collection est une interface (la plus générale des collections).
    Il vaut mieux, quand c'est possible, toujours utiliser en type apparent des interfaces (comme ça tu peux changer d'implémentation sans réécrire/refactorer tout ton code)

    Ensuite, Vector date de l'ancienne API de collections, qui date de java 1.0 et qui a été remplacé (même si elle est toujours là pour la compatibilité ascendante) dans java 1.2, c'est-à-dire il y a maintenant 7 ans.
    Maintenant la classe qui fait la même chose, mais en mieux et en plus rapide, c'est ArrayList.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Collection<String> col = new ArrayList<String>();
    // ou
    List<String> list = new ArrayList<String>();
     
    //selon que tu veuilles que ça soit une liste absolument ou si ça change quelque chose si tu remplaces par un ensemble (au niveau de l'interface utilisée)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    D'accord, message compris pour les collections et le système d'interfaces en général. Désormais j'appliquerais cela ^^. merci pour l'explication.

    Sinon personne ne peut m'aider pour mon problème?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    UP please... Cela fait deux jour maintenant que je bloque sur ce probleme. Impossible d 'en trouver la solution.

  11. #11
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Serialisation

    Declaration de la classe serialisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import java.io.*;
    import java.util.*;
     
    public MaClasse implements Serializable {
        private String monPremierAttribut;
        private Date monSecondAttribut;
        private long monTroisièmeAttributs;
     
        // . . . d'éventuelles méthodes . . .
    }
    Pour l'ecriture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try {
        OutputStream os = sockService.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
     
        while(true) {
    	Message msg = this.createMessage();
            oos.writeObject(msg)
            oos.reset();
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
    Pour la lecture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public void lecture() throws Exception {
            FileInputStream fis = new FileInputStream("nom fichier");
            ObjectInputStream ois = new ObjectInputStream(fis);
            String contenu = (String)ois.readObject();
            ois.close();
     
        }

Discussions similaires

  1. thread et objet
    Par zenetcalme dans le forum Threads & Processus
    Réponses: 15
    Dernier message: 03/06/2008, 13h46
  2. Constante objet modifiable !
    Par j0o0 dans le forum Langage
    Réponses: 1
    Dernier message: 08/05/2007, 08h34
  3. Réponses: 3
    Dernier message: 07/01/2007, 16h48
  4. Retrouver les objets modifiés
    Par zooffy dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/12/2006, 11h42
  5. [C#] Serialisation d'un objet CellSet (ADOMD.NET)
    Par scifire dans le forum Services Web
    Réponses: 2
    Dernier message: 05/12/2006, 07h35

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