Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1619 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Xml Serialisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Xml Serialisation

n°1274410
fluminis
Posté le 29-12-2005 à 13:48:43  profilanswer
 

Bonjour à tous,
 
Voila je cherche à serialiser une liste d'elements.
Donc j'utilise les fonctions du framwork (XmlSerialize...)
 
Mon probleme est que les objets de la liste ont des references croisées

Code :
  1. MaListe[0] = new MonObj();
  2. MaListe[1] = new MonObj();


et

Code :
  1. MaListe[0].MaPropriete = MaListe[1];


 
Comment dois je proceder pour serialiser ça et pour qu'à la déserialisation j'ai bien la meme réference dans MaListe[0].MaPropriete et MaListe[1]
 
Merci d'avance
 
fluminis


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
mood
Publicité
Posté le 29-12-2005 à 13:48:43  profilanswer
 

n°1274868
fluminis
Posté le 30-12-2005 à 11:34:23  profilanswer
 
n°1279487
_Mose_
Lonesome coder
Posté le 09-01-2006 à 11:50:20  profilanswer
 

Je vote : c'est pas possible en utilisant simplement XmlSerialize.
 
Ce qui fait que tes deux objets sont identiques, c'est le hashcode (voir GetHashCode()) que colle .Net à chaque objet différent.
Tes 2 objets sont le même pask'ils ont le même hashcode. Mais quand tu les sérialize, tu les "aplati" : tu choppes que les données brut. Le hashcode n'est pas stocké (et heureusement), pask'il est dynamique, et dépend de chaque exécution.
 
Pour abréger : sérializer, ça transforme un objet en un "paquet de donées".
Ta sérialization transforme donc tes références croisées en "paquets de données" distinct avec un contenu identique.
Donc quand tu désérialize, très logiquement il te recréé deux objets différents.
 
Solutions :
1 - Rajouter un paramètre ID dans tes objets, faire la désérialization à la main, objet par objet, et quand tu tombes sur un ID déjà désérializé, retourner une référence au lieu d'une nouvelle instance.
2 - Utiliser une autre structure de donnée. Genre d'un côté les données brutes (les instances sans références croisées) et de l'autre leur rangement (l'ordre dans lequel les coller dans le tableau et les références croisées éventuelles).
 
Bon y'a ptet mieux, mais faudrait voir le code...


---------------
Tout est normal, suffit de comprendre pourquoi.
n°1279570
fluminis
Posté le 09-01-2006 à 14:13:02  profilanswer
 

J'ai trouvé mieux,
 
SoapFormatter !
 
Ca gere tout seul les references, par contre point négatif, ça genere un code Xml peut clair donc pas la joie si on souhaite laisser à l'utilisateur le soin d'éditer ses fichiers à la main.
N'ayant pas besoin de cette clarté pour mon utilisation actuelle, cela me convient tout à fait.
 
Merci pour ton explication
 
++
Fluminis


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1279601
_Mose_
Lonesome coder
Posté le 09-01-2006 à 14:53:00  profilanswer
 

Ca marche avec les références croisées ? T'as essayé dans la pratique ?


---------------
Tout est normal, suffit de comprendre pourquoi.
n°1279604
fluminis
Posté le 09-01-2006 à 14:55:51  profilanswer
 

Ouais ça semble fonctionner avec les references croisées
 
Class A contient une liste d'objets class B
et B contient des reference vers des objets B
Serialiser l'objet A puis le deserialiser concerve les references


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1280141
_Mose_
Lonesome coder
Posté le 10-01-2006 à 09:54:31  profilanswer
 

Et si tu sérialize un tableau qui contient des références doublées genre un tableau contenant 3 objets : A A B
Si tu sérialize/désérialize, est ce que les deux premiers seront des références vers A, ou vers deux objets distincts mais avec des valeurs identiques ?
C'est par pure curiosité, si c'est prise de tête, oubli  :bounce:


Message édité par _Mose_ le 10-01-2006 à 09:55:20

---------------
Tout est normal, suffit de comprendre pourquoi.
n°1280210
fluminis
Posté le 10-01-2006 à 11:21:47  profilanswer
 


je ne suis pas un pro de SOAP, mais par exemple un Arraylist serait serialisé de la sorte :
 

Code :
  1. <a2:ArrayList id="ref-12" xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections">
  2. <_items href="#ref-13"/>
  3. <_size>7</_size>
  4. <_version>9</_version>
  5. </a2:ArrayList>
  6. <SOAP-ENC:Array id="ref-13" SOAP-ENC:arrayType="xsd:anyType[16]">
  7. <item href="#ref-14"/>
  8. <item href="#ref-15"/>
  9. <item href="#ref-16"/>
  10. <item href="#ref-17"/>
  11. <item href="#ref-18"/>
  12. <item href="#ref-19"/>
  13. <item href="#ref-20"/>
  14. </SOAP-ENC:Array>


avec chaque item definit par dans mon cas :

Code :
  1. <a1:UserClass id="ref-14" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Hornet.HornetModel/Hornet.HornetModel%2C%20Version%3D1.0.2199.25506%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
  2. <m_Name id="ref-22">Class0</m_Name>
  3. <m_RelationName href="#ref-7"/>
  4. <m_ListName id="ref-23">Class0List</m_ListName>
  5. <m_AttributeList href="#ref-24"/>
  6. </a1:UserClass>


Comme c'est lui tout seul comme un grand qui met les attributs href="#ref-XX" et les id="ref-XX" je pense que ca ne pose pas de problemes
 
++
fluminis


---------------
http://poemes.iceteapeche.com - http://www.simuland.net

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Xml Serialisation

 

Sujets relatifs
Parser les résultats de Webalizer vers du XML ?probleme sur le retun d'une classe de load XML
deux questions... chargement XML et faire apparaitre les elementsRequête sur fichier XML comme BDD
Question sur XML avec C++Xml / ISO et python qui veut pas des caractères non ascii [Résolu]
[Delphi] 2005 Personal + XMLParser un XML ?
Flash, XML event et Alert (et TDWTF)Appeler une fonction GetUrl dans un fichier XML
Plus de sujets relatifs à : [C#] Xml Serialisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR