Xml Serialisation [C#] - C#/.NET managed - Programmation
Marsh Posté le 30-12-2005 à 11:34:23
ReplyMarsh 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...
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
Marsh Posté le 09-01-2006 à 14:53:00
Ca marche avec les références croisées ? T'as essayé dans la pratique ?
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
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
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 :
|
avec chaque item definit par dans mon cas :
Code :
|
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
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
et
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