[C#] Xml Serialisation

Xml Serialisation [C#] - C#/.NET managed - Programmation

Marsh Posté le 29-12-2005 à 13:48:43    

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
Reply

Marsh Posté le 29-12-2005 à 13:48:43   

Reply

Marsh Posté le 30-12-2005 à 11:34:23    

Reply

Marsh Posté le 09-01-2006 à 11:50:20    

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.
Reply

Marsh Posté le 09-01-2006 à 14:13:02    

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
Reply

Marsh Posté le 09-01-2006 à 14:53:00    

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


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 09-01-2006 à 14:55:51    

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
Reply

Marsh Posté le 10-01-2006 à 09:54:31    

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.
Reply

Marsh Posté le 10-01-2006 à 11:21:47    


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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed