Serialisation et conservation de reference a une arraylist

Résolu
cs_bobby3 Messages postés 14 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 24 mars 2009 - 23 mars 2009 à 11:18
cs_bobby3 Messages postés 14 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 24 mars 2009 - 24 mars 2009 à 13:42
Bonjour a tous

J'explique mon probleme

je gère des clients qui ont un certain nombre de specificité

j'ai une classe statique ou sont contenus une arraylist de client et une arraylist de specificité globale

dans client j'ai une arrylist de specificité qui lui sont propre

lorsque je crée un client je lui ajoute des specificité de cette manière

Code :
 
cli=new client()
cli.sesspecificité.add(classe statique.obtenirspecifité(numspecificité)
cli.sesspecificités.add......
 

tant que je suis dans l'application, les specificité contenus
dans le client sont bien les memes que celles contenus dans la classe
statiques, si je fais

Code :
cli.sesspecificités.remove(classestatique.obtenirspecifité(numspecificité)
//en considérant que la specificité est bien contenus dans le client

cela marche très bien

en revanche si je quitte mon application, je serialise ma liste de
client et ma liste de specificité contenus dans la classe statique en
SOAP

je relance mon application, je deserialise tout ca dans la classe
statique, dans ma classe statique j'ai bien toutes mes données, dans
mes clients j'ai bien toute mes specificités, mais lorsque je fait

Code :
cli.sesspecificités.remove(classestatique.obtenirspecifité(numspecificité)
//en considérant que la specificité est bien contenus dans le client

cela ne marche pas, comme si que la specificité a enlever était une nouvelle spécificité

Une seule explication a cela, je pense que lors de la sérialisation ou
la serialisation, il me créé des spécificité dans la liste de
specificité des clients plutot que de faire références aux spécificités
contenus dans la classe statique

je ne sait absolument pas comment résoudre ce probleme, merci d'avance pour vos réponses

6 réponses

cs_bobby3 Messages postés 14 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 24 mars 2009
24 mars 2009 à 13:42
bon bas je me suis résolu le problème tout seul


d'après moi le problème est que les spécificités d'un acteur ne pouvait
pas référence à la liste de spécificité car cette liste n'était pas
sérialisé dans le même fichier , je pense qu'il n'avait aucun moyen de
dire que la référence provenait d'un autre fichier

pour remédier à cela au lieu de sérialiser chaque collection dans un
fichier différent j'ai créé une collection contenant toutes les autres
collection, et cette collection globale, de ce fait les spécificité
d'un acteur pointait bien vers les spécificités globales contenus dans
le même fichier (#réf)


Voila en ésperant que ce post aidera des personnes qui un jour se
retrouveront avec le même problème que moi, c'est d'ailleurs étonnant
que je n'ai rien trouvé à ce sujet sur internet
3
titeoe Messages postés 433 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 4 décembre 2009 1
23 mars 2009 à 16:25
bonjour,

quand tu sérialise ton objet client, as tu regardé si dans le Xml les spécificités sont bien indiquées ?

question, tu sérialises en SOAP, qu'entends tu par la ?
0
cs_bobby3 Messages postés 14 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 24 mars 2009
23 mars 2009 à 16:41
oui dans le fichier client les spécificité sont bien indiqués, le probleme est lors de la deserialisation j'ai l'impression qu'au lien des remplir les liste de specificité d'un client a partir des specificité globales contenus dans la classe statique il me fait un new specificité()
dés lors lorsque je veux faire un remove des specificités d'un client a partir d'une specificité globale il me le trouve pas
sinon pour le SOAP il y a 3 types de serialisation: SOAP, xml et binaire, moi j'ai choisi la serialisation SOAP( qui serialise aussi en XML mais n'oblige pas à déclarer les champs en publics)
J'ai passé la journée dessus j'y comprend absolument rien
0
cs_bobby3 Messages postés 14 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 24 mars 2009
23 mars 2009 à 17:36
un petit up car j'ai du nouveau
Il semblerait que lors de la serialisation ou de la deserialisation les références ne soit pas gardés
j'ai parcouru les fichiers xml de long en large et j'ai remarqué que les dépendances ne sont pas gardés lorsque je serialise
dans acteurs:

je vais dans ref14
<_items href="#ref-19"/>
<_size>1</_size>
<_version>1</_version>

je vais dans ref19

<SOAP-ENC:Array id="ref-19" SOAP-ENC:arrayType="xsd:anyType[4]">
*

je vais dans ref20

<libelle id="ref-21">spe1</libelle>

et la j'apercoit une nouvelle specificité, alors que la reference devrait etre vers le fichier specificité
dans specificité

<libelle id="ref-6">spe1</libelle>

pourtant dans le code tant que je ne quitte pas mes specificité sont bien issus de la collection de specificité contenus dans modele

Si certains ont des idées je suis preneur car je ne sait plus quoi faire
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
titeoe Messages postés 433 Date d'inscription samedi 26 avril 2003 Statut Membre Dernière intervention 4 décembre 2009 1
24 mars 2009 à 10:30
hmmm

Je ne suis pas expert en soap mais je pense qu'il faut que tes propriétés soient bien présentes dans ton XML avant d'aller + loin.

As tu regardé la maniere dont les spécificités sont sérialisées ?
Autre chose , si vraiment tu galères un peu, tu peux écrire du code dans la méthode OnDeserialize qui te permettra d'initier tes spécificités après désérialisation.
0
cs_bobby3 Messages postés 14 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 24 mars 2009
24 mars 2009 à 10:40
au  niveau du xml les données son bien présentes
le problème est que, pour simplifier, au lieu que dans le xml acteurs ils mettent "va me chercher la specificité dans la collection de specificité", il me créé une spécificité, comme je l'ai marqué au dessus

<libelle id="ref-21">spe1</libelle>

après ca c'est peut être normal je ne sait pas je ne suis pas expert non plus en SOAP
je te monte aussi la anière dont je serialise deserialise peut-etre que ca pourrait t'aider
au lancement de l'appli
//on charge les données
            modele.ListSpe_set_get = modele.deserialiser(modele.ListSpe_set_get, "specificite");
            modele.ListProduit_set_get = modele.deserialiser(modele.ListProduit_set_get, "produit");
            modele.ListActeur1_set_get=modele.deserialiser(modele.ListActeur1_set_get, "acteur");
            modele.ModeDePasse_set_get = modele.deserialiser(modele.ModeDePasse_set_get, "MDP");
            modele.ListRaccourci_set_get = modele.deserialiser(modele.ListRaccourci_set_get, "raccourci");

a la fermeture de l'appli
modele.serialiser(modele.ListSpe_set_get, "specificite");
            modele.serialiser(modele.ListProduit_set_get, "produit");
            modele.serialiser(modele.ListActeur1_set_get,"acteur");
            modele.serialiser(modele.ModeDePasse_set_get, "MDP");
            modele.serialiser(modele.ListRaccourci_set_get, "raccourci");
            Application.Exit();

méthode dans la classe statique
        public static void serialiser(ArrayList col, string nom)//sauvegarde des données
        {
            string fichier = Application.StartupPath + "\\donnée\" + nom;
            FileStream fs = null;
            try
            {
                fs = File.Open(fichier, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                SoapFormatter bf = new SoapFormatter();
                {
                    bf.Serialize(fs, col);

                }
                fs.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("pbs sauvegarde donnée " + nom);
                }
        }

        public static ArrayList deserialiser(ArrayList col, string nom)
        {
            string fichier = Application.StartupPath + "\\donnée\" + nom;
            FileStream fs = null;
            try
            {
                fs = File.Open(fichier, FileMode.Open, FileAccess.Read, FileShare.None);
                SoapFormatter bf = new SoapFormatter();
                col = ((System.Collections.ArrayList)bf.Deserialize(fs));
                fs.Close();
                return (col);

            }
            catch (Exception)
            {
                MessageBox.Show("problème lecture des données "+nom);
                try { fs.Close(); }
                catch { };//au cas ou sa ne se serait pas fermé
                return (new ArrayList());
            }
        }

voila dit moi ce que t'en pense, peut-etre faut'il serialiser les données "en même temps"
Sinon comme tu le voit pour la serialisation et le deserialisation c'est C# qui s'occupe de tout donc je ne peut pas trop intervenir ou modifier le processus
0
Rejoignez-nous