Remplissage d'un ArrayList par serialisation ? [Résolu]

cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 02:12 - Dernière réponse : cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention
- 16 nov. 2006 à 12:05
Bonjour, voila j'aimerais remplir un ArrayList par serialisation mais sa marche pas quel etape ai je louper? :
Je passe dans mon constructeur le string Intitule.
Donc en faite, j'ai un datagrid et tant qu'il y a des lignes, il doit ajouter le contenu de la ligne active dans le ArrayList :

    while (i < dataGridView1.Rows.Count - 1)
            {
                ClsApercuImpression valeur = new ClsApercuImpression(dataGridView1.Rows[i].Cells["Intitule"].Value.ToString());
                valeur.enregistrer();
                i++;
            }

 Ma classe pour serialiser :

     public void enregistrer()
            {          
                ArrayList al = new ArrayList();
                ClsApercuImpression p = new ClsApercuImpression(Intitule);
                al.Add(p);
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.Write);
                formatter.Serialize(fs, al);
                fs.Close();
            }

Donc sa fonctionne a peu pres car il me donne la derniere ligne de mon datagrid. En faite il ecrase mon ArrayList a chaque fois, A cause du new je suppose ? Mais comment faire pour ajouter le contenu de la cellule active au precedente?
Je sais pas si jsuis tres clair :/.
Merci .
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 17:10
3
Merci
>Oui se sont des strings dans le tableau car se sont les données recuperer dans un datagrid.



Beh, tu as toi meme la réponse a ton probleme... Si ce sont des strings dans ton ArrayList, alors tu vas recuperer des strings a la sortie, pas des ClsApercuImpression.
Ou alors il faut que tu mettes des ClsApercuImpression dans ton ArrayList

Reprenons le principe :
Tu as la base un ArrayList. Dans cet ArrayList, tu as mis des strings.
Tu serialises cet ArrayList. Tu as donc, sur ton disque, la representation binaire de ton ArrayList (contenant tes strings) sous la forme d'un fichier.

Ensuite, tu prends ce meme fichier, et tu fais une opération de deserialisation. Tu vas donc retrouver ton ArrayList dans le meme état qu'il etait avant la serialisation, c'est a dire, avec tes strings a l'interieur.

Mx
MVP C# 

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de MorpionMx
Meilleure réponse
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 21:55
3
Merci
Retourne ton ArraList plutot, parce que comme tu le fais la, ca peut pas marcher.

Mx
MVP C# 

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de MorpionMx
Meilleure réponse
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 22:10
3
Merci
Nikel ;o) merci beaucoup beaucoup beaucoup. Par contre c'est nulle qu'one ne puisse pas renvoyer ligne par ligne dans la methode mais bon pas grave 1000 fois merci.

Form1 contenant un datagrid : enregistrement de l'arraylist en le serialisant puis affichage de la Form2

            int i=0;
            ArrayList al = new ArrayList();
            while (i < dataGridView1.Rows.Count - 1)
            {
                al.Add(dataGridView1.Rows[i].Cells["Intitule"].Value.ToString());
                i++;
            }
            ClsApercuImpression enregistrer = new ClsApercuImpression();
            enregistrer.enregistrer(al);     
            Form2 affiche = new Form2();           
            affiche.ShowDialog();

serialisation depuis la methode de la classe ClsApercuImpression :

            public void enregistrer(ArrayList al)
            {
            
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.Write);
                formatter.Serialize(fs, al);
                fs.Close();
            }

Form2 : affichage des données recuperer par la deserialisation dans un label :

  private void FactureImpression_Load(object sender, EventArgs e)
        {
            ClsApercuImpression valeur = new ClsApercuImpression();
            ArrayList al =  valeur.lecture();
            foreach (String a in al)
            {
            label1.Text =label1.Text+"\n"+ a.ToString();
            }
}

deserialisation depuis la methode de la classe ClsApercuImpression :

           public ArrayList lecture()
            {               
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);               
                ArrayList al = (ArrayList)formatter.Deserialize(fs);
                fs.Close();        
                return al;           
            }

Voili je met tout on sais jamais sa peut aider.
Encore merci.

Merci cs_wally88 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_wally88
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 08:50
0
Merci
Salut

Il te suffit d'instancier ton Arraylist une seule fois (au premier element), puis tu lui ajoutes tous les éléments, et finalement, tu le serializes aprés le dernier élément.

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 14:46
0
Merci
Merci sa ma bien aider ;o) mon arrayList se rempli bien par contre j'ai un soucis de lecture car moi pas tout comprend (pour changer) si tu pouvais m'eclirer la dessus aussi :
Donc je veux lire mon arraylist et renvoyer chaque ligne de l arrayList, je dois pas etre trop loin mais c'est quoi l'identificateur dans le foreach ?

     public void lecture()
            {               
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);               
                ArrayList al = (ArrayList)formatter.Deserialize(fs);
                fs.Close();
            
                foreach (Identificateur ain al)
                {
                                          
                }                         
            }

Merci.
Commenter la réponse de cs_wally88
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 14:53
0
Merci
Un ArrayList ne contient que des Objects ;)

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 14:59
0
Merci
Oui je suis d'accord la dessus mais quel objet ? Car dans mon livre il mette le nom de la classe en faite mais il me dis qu'il y a un probleme de conversion. Enfin sa fonctionnais avec ma methode enregistré dans mon premier message il me renvoyais bien si la derniere saisie etais "a" il m'affichais bien "a" hors la depuis que j ai changer ma methode de d'enregistrement cad que le tableau se rempli bien il me dis que je ne peu convertir un string en tableau ou inversement.

     public void lecture()
            {               
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);               
                ArrayList al = (ArrayList)formatter.Deserialize(fs);
                fs.Close();
       
                foreach (ClsApercuImpression a in al)
                {
                    p_intitule = a.Intitule;                           
                }             
            }

Donc que faut il que je fasse ? peut etre renvoyer un tableau et le lire apres ?
Merci pour ton aide.
Commenter la réponse de cs_wally88
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 15:15
0
Merci
Je vois  pas bien ce que tu veux dire.

Si tu serializes bien un ArrayList, et si les objets contenus dans ton ArrayList sont bien des ClsApercuImpression, alors il ne devrait pas y avoir de souci.
A quelle ligne tu as ton erreur ? Quel est l'intitulé exact de l'exception ?

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 15:24
0
Merci
      public void lecture()
            {                
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);                
                ArrayList al = (ArrayList)formatter.Deserialize(fs);
                fs.Close();
                int i=0;
                 foreach (ClsApercuImpression a in al)
                {
                    p_intitule = a.Intitule;
                    i++;                     
                }              
            }

foreach (ClsApercuImpression a in al) : Impossible d'effectuer un cast de type system.string en type krystl.clsApercuImpression.
Commenter la réponse de cs_wally88
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 15:30
0
Merci
Ca voudrait dire que as des string dans ton ArrayList

Donc il faut voir de quelle facon tu sérialises tes objets.

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 15:48
0
Merci
Oui se sont des strings dans le tableau car se sont les données recuperer dans un datagrid.
Je serialise comme sa, en passant l'arraylist contenant les données recuperer de mon datagrid et cela fonctionne bien apparmement :

     public void enregistrer(ArrayList al)
            {           
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.Write);
                formatter.Serialize(fs, al);
                fs.Close();
            } 

et je deserialise comme sa et c'est la ou est le probleme :

  

public void lecture()
            {                
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);                
                ArrayList al = (ArrayList)formatter.Deserialize(fs);
                fs.Close();      
                 foreach (ClsApercuImpression a in al)
                {
                    p_intitule = a.Intitule;                           
                }              
            }

Y a t il un soucis dans la serialisation ? Pourquoi sa marche avec un string mais pas avec un arraylist de string ?
Merci.
Commenter la réponse de cs_wally88
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 21:37
0
Merci
Bon alors ca avance :D je veux retourner mes chaine de caractere :

    public string lecture()
            {               
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream fs = new FileStream("temp.txt", FileMode.Open, FileAccess.Read);               
                ArrayList al = (ArrayList)formatter.Deserialize(fs);
                fs.Close();
              
                foreach (String a in al)
                {
                    return a.ToString();                                       
                }                           
            }
Le soucis etant que le return doit etre a l'exterieur du foreach car sinon il me dis que sa ne retourne pas forcement quelque chose.
Comment je fais pour qu il retourne chaque element ? Car il parcour bien le arraylist mais si jmet le return hors du foreach il prend comme valeur la derniere du tableau.
Merci
Commenter la réponse de cs_wally88
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2006 à 22:25
0
Merci
Y'a pas de quoi.
Au fait, si jamais tu bosses en .Net 2, utilises des List<string> a la place de tes ArrayList ;)

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 15 nov. 2006 à 22:27
0
Merci
Oui je suis en .net 2, euh juste comme sa j'y gagne a quoi d'utiliser List<string> si l'arraylist fonctionne ?
Commenter la réponse de cs_wally88
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 16 nov. 2006 à 09:01
0
Merci
De façon générale, en .Net 2 on utilise des collections générique (List<T>, Stack<T>, ...)

Dans ton cas, l'ArrayList stocke de Objects, la List<string> des strings. Dans ton foreach, chaque objet de ArrayList est donc casté en string. Ce qui n'a plus lieu avec une List<string>. Evidement, la tu ne vas pas voir grande différence, mais sur de larges collections, cela peut faire gagner un peu de temps. Et les collections génériques sont type safe. 

Enfin c'etait juste une recommandation. En .Net 2 autant utiliser des collections génériques. Meme si dans ton cas présent ce n'est pas crucial, pour tes prochains devs, autant le faire, tu as tout a y gagner.

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_wally88 361 Messages postés jeudi 5 février 2004Date d'inscription 1 octobre 2010 Dernière intervention - 16 nov. 2006 à 12:05
0
Merci
Oki merci pour l'explication c'est sympas, je ferai comme sa maintenant.
Merci pour tout bonne prog et a bientot surement :o).
Commenter la réponse de cs_wally88

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.