ricklekebekoi
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
4 mai 2008 à 17:29
J'ai jeter un oeil et malheureusement je ne croit pas que ce soit la solution idéale
"Tu cherches a complexifier un truc d'apparence simple"
C'est possible, je n'ai probablement pas la bonne approche is c'est le cas.
Mon objectif:
Présenter un système de Save/Load utilisant la serialisation binaire et l'utiliser de manière efficace même lorsque les objets à serializer sont complexes. Permettre a l'usager d'avoir a n'en faire le moins possible pour enregistrer ces trucs dans un fichier et les reloader.
Ma solution, lors du Save:
Faire heriter les objets à sauvegarder d'un objet contenant un "Serial", soit un numéro unique associé a l'objet. N'enregistrer tout d'abord dans le fichier la liste des serial à enregistrer, puis ensuite Serialiser chacun des objets associé.
Ma solution, lors du Load:
Créer des objets vides avec chacun des serials de la liste. Leur propriétés se rempliront lorsque le deserialize de cet objet sera appelé. Deserializer ensuite chacun des objets de la liste.
Exemple:
Dans mon programme de gestion familial, j'ai 5 objets de type personne:
Personne( string nom, DateTime dateNaiss, Personne[] Amis )
Serial 0x45CF : Personne( Bob, 1987-01-09, {Ginette,Alphonse})
Serial 0x55E3 : Personne( Ginette, 1988-03-13, {Bob,Leo} )
Serial 0x1CF8: Personne( Leo, 1989-05-14, {Ginette,Alphonse,Rita} )
Serial 0x432E : Personne( Alphonse, 1980-07-21, {Bob,Leo,Rita} )
Serial 0x1111 : Personne( Rita, 1981-08-31, {Leo,Alphonse} )
Au moment de la save, je save d'abord type&serial
0x45CF : Personne
0x55E3 : Personne
0x1CF8: Personne
0x432E : Personne
0x1111 : Personne
Ensuite, je serialize chacun des objets. Lorsqu'un objet de type Personne est demandé, il n'écrit que le serial de la personne
Personne : 0x45CF, Bob, 1987-01-09, 2, 0x55E3, 0x432E
Personne : 0x55E3, Ginette, 1988-03-13, 2, 0x45CF, 0x1CF8
Personne : 0x1CF8, Leo, 1989-05-14, 3, 0x55E3, 0x432E, 0x1111
Personne : 0x432E, Alphonse, 1980-07-21, 3, 0x45CF, 0x1CF8, 0x1111
Personne : 0x1111, Rita, 1981-08-31, 2, 0x432E, 0x1CF8
Voila, ils ont tous été sauvegardés de manière unique.
Maintenant, si l'on desire loader le tout, on va commencer par créer les 5 objets personnes en n'y déposant QUE le serial.
new Personne(0x45CF );
new Personne(0x55E3 );
new Personne(0x1CF8 );
new Personne(0x432E );
new Personne(0x1111 );
Ensuite, on appel la fonction deserialize des objets. Au moment de déserializer le premier, 0x45CF, il fait référence aux 2 objets 0x55E3, 0x432E. Puisque 2 objets existe avec ces 2 serial, on peut directement les référencés sans problemes et ce même si ces objets ne sont pas encore deserializé.
Au final, nous nous retrouvons avec la même structure qu'au départ, et la save aura nécessité un minimum d'espace memoire.
Probleme rencontré:
Dans cet histoire, Bob part en voyage loin loin, mais son avion Crash, et meurt.
On enleve donc Bob des amis de Ginette et Alphonse, car Bob n'existe plus dans le systeme.
Au moment de la save, on enregistrera toujours bob, car même si celui-ci n'existe plus dans le système, il est encore dans la liste des "ObjetsUnique" A sauvegarder.
Solutions trouvés:
1. Obliger l'usager a appeler explicitement une methode "Dispose()" ou similaire qui permetterait de l'enlever de la liste et de "nullifier" l'objet. Cette action me déplait car il faudra obliger l'usager a le faire lui meme toujours. Dans le cas de l'Exemple, c'est simple rajouter la ligne dans la fonction "Meurt()" de Personne. Parcontre, dans des systemes plus complexes ou tres différentes, ce ne sera pas commode.
2. Lors du load, noter tous les objets encore utilisés et ceux qui ne le sont plus. Supprimer les inactif et lors de la prochaine save, elle aura ceux-la en moins. Cette solution me déplait car la save sera parfois tres volumineuse pour rien sur le disque, et le Load() sera fait de maniere plus lente.
3. Lors du save, effectuer une premiere fois la save dans un fichier bidon, pour noter les objets utilisés. Ensuite enlever les inactifs et faire la vrai save. Cette solution me déplait car la save sera énormément longue dans les gros systemes.
Conclusion:
Bref, la solution 2 serait celle que j'implémenterais je pense faute d'avoir une meilleure solution, tout en ajoutant la solution 1 en "a coté" a l'usagé. Maius bon, j'aimerais trouver mieux.
Donc, est-ce que je complexifie quelquechose de simple et que je pourrais obtenir un resultat semblable de maniere bien plus intéressante et simple ?
Et si non, comment pourrais-je miraculeusement résoudre mon problème ?
Un gros merci, j'espere qu'avec ce roman tout est plus clair
Eric