Serialisation et conservation de reference a une arraylist [Résolu]

Messages postés
14
Date d'inscription
mardi 24 janvier 2006
Statut
Membre
Dernière intervention
24 mars 2009
- - Dernière réponse : 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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
14
Date d'inscription
mardi 24 janvier 2006
Statut
Membre
Dernière intervention
24 mars 2009
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_bobby3
Messages postés
433
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
4 décembre 2009
1
0
Merci
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 ?
Commenter la réponse de titeoe
Messages postés
14
Date d'inscription
mardi 24 janvier 2006
Statut
Membre
Dernière intervention
24 mars 2009
0
Merci
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
Commenter la réponse de cs_bobby3
Messages postés
14
Date d'inscription
mardi 24 janvier 2006
Statut
Membre
Dernière intervention
24 mars 2009
0
Merci
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
Commenter la réponse de cs_bobby3
Messages postés
433
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
4 décembre 2009
1
0
Merci
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.
Commenter la réponse de titeoe
Messages postés
14
Date d'inscription
mardi 24 janvier 2006
Statut
Membre
Dernière intervention
24 mars 2009
0
Merci
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
Commenter la réponse de cs_bobby3