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

Android Discussion :

Sérialisation d'une ArrayList<>


Sujet :

Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Par défaut Sérialisation d'une ArrayList<>
    Bonjour à tous. J'ai un petit problème pour sérialiser mon arrayList et pour la récupérer.
    Mon code :
    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
    public static void serialiser(ArrayList<Point> alp, String path)
        {
     
             ObjectOutputStream serialise;
            try {
                serialise = new ObjectOutputStream(new FileOutputStream(path));
     
                serialise.writeInt(alp.size());
     
                for (int i =0; i < alp.size(); i++){
     
                serialise.writeObject(alp.get(i));
                serialise.flush();
     
                }
                serialise.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
     
     
        }
     
     
     
     
        public static ArrayList<Point> deserialiser(String path)
        {
            ArrayList<Point> retour = new ArrayList<Point>();
     
            ObjectInputStream deserialise;
            try {
     
                deserialise = new ObjectInputStream(new FileInputStream(path));
                for (int i = 0; i < deserialise.readInt(); i++){
                    Point p = (Point)deserialise.readObject();
                    retour.add(p);
                }
     
            } catch (StreamCorruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
            return retour;
     
        }
    Quelqu'un aurait une idée ? Merci

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    Pourrais tu nous préciser quel est ton problème ? (le code compile pas, il y a une erreur à l'exécution, il ne se passe rien, etc).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Par défaut
    Je passe dedans avec le debuger et il rentre dans le catch en passant les lignes :

    serialise.writeObject(alp.get(i));

    Point p = (Point)deserialise.readObject();

    Ma classe Point implements Serializable

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Il rentre dans quel catch ?
    Peux tu donner l'exception qui s'affiche sur ta console ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Par défaut
    Dans les 2 cas il rentre dans le catch (IOException e), par contre, aucun message d'erreur dans la console ou autre...

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Ca le devrait pourtant vu qu'ici
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    tu écrit dans la sortie d'erreur l'exception.
    Et si tu ajoutes dans le catch
    ca t'affiche toujours rien ?

    Si c'est le cas, dans ton débugger (Eclipse ou autre), inspecte la valeur de la variable e lorsqu'il rentre dans le catch. Tu devrais avoir l'exception.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Par défaut
    Il m'affiche un inspectant e :

    "NotSerializableException" avec comme messagedetail : "android.location.Location". Comment rendre Location Serializable ?

    Merci.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Bien
    Par contre, clairement tu ne peux pas rendre serializable android.location.Location si c'est une classe de l'api Android.

    Si tu tiens absolument à serialiser le contenu de android.location.Location, tu auras un peu de travail voir beaucoup selon les objets non serializables derrières et tes besoins.
    Et oui, il y en a peut-être d'autres

    Il y a plusieurs solutions de contournement.
    La plus simple :
    Ajouter le mot clef transient devant la déclaration de ton champ location.
    et définir dans ta classe Point les méthodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void writeObject(ObjectOutputStream out)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void readObject(ObjectInputStream in)
    Tu peux avoir un exemple plus complet ici :
    http://ydisanto.developpez.com/tutor...artie1/#LIII-A

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Par défaut
    Merci pour le site. J'avais déjà essayé avec le mot-clé transient, mais je comprends pas le principe de
    private void writeObject(ObjectOutputStream out)
    et
    private void readObject(ObjectInputStream in)
    Dans l'exemple, sa variable de type "int" implémente Serializable.

    Quelqu'un pourrait me donner quelques conseils ? Encore merci

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Allez courage, c'est pas si dur

    Le principe est simple : c'est à toi de définir les champs que tu veux sérialiser et deserialiser.

    Dans l'exemple, sa variable de type "int" implémente Serializable.
    Oui et justement toi aussi tu devras serialiser des types serializables dans la méthode.
    Tu ne peux pas sérialiser directement l'objet Location. Aussi tu vas serialiser les champs serializables de la classe Location dont tu as besoin.
    Par exemple,Imaginons que tu souhaites serialiser et deserialiser uniquement la latitude (qui est un champ double) de ton objet location, tu feras dans tes méthodes writeObjet et readObject :
    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
     
    public class Point implements Serializable{
     
    private transient Location location;
     
    private void writeObject(ObjectOutputStream out) throws IOException {
    		// appel des mécanismes de sérialisation par défaut
    		out.defaultWriteObject();				
    		out.writeDouble(location.getLatitude()); 
    	}
     
    private void readObject(ObjectInputStream in) {
    		// appel des mécanismes de désérialisation par défaut
    		in.defaultReadObject();
     
    		double latitude= in.readDouble(); 
                    location = new Location()
                    location.setLatitude(latitude);
    	}
    }

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Par défaut
    Ah d'accord ! J'ai compris le principe. Merci beaucoup =D

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Bonne sérialisation alors !

Discussions similaires

  1. Problème d'accès à une ArrayList sérialisable
    Par hich.houch dans le forum Glassfish et Payara
    Réponses: 4
    Dernier message: 03/06/2014, 11h22
  2. Sérialisation XML d'une ArrayList
    Par Contrec dans le forum C#
    Réponses: 6
    Dernier message: 29/11/2008, 09h57
  3. [Collections]Compter les mots différents d'une ArrayList
    Par alanpix dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 21/11/2005, 22h11
  4. [C#] Passage en paramètre d'une ArrayList
    Par bendj dans le forum ASP.NET
    Réponses: 6
    Dernier message: 16/08/2005, 10h41
  5. Réponses: 2
    Dernier message: 02/08/2005, 09h40

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