[C++] Serialisation d'une liste d'objets dérivés

Serialisation d'une liste d'objets dérivés [C++] - C++ - Programmation

Marsh Posté le 07-06-2004 à 18:51:50    

Je cherche la manière la plus séduisante pour stocker dans un fichier au format binaire une liste d'objets.
 

Code :
  1. std::list<cbase*> liste_objets;


 
Ces objets ont la particularité d'hériter d'une classe de base (non abstraite).
 

Code :
  1. class cbase
  2. {
  3. virtual void serialisation( ofstream& fichier_destination );
  4. virtual void deserialisation( ifstream& fichier_source );
  5. /*** ...d'autres membres ici! ***/
  6. }


 
Tous mes objets, ainsi que la classe de base disposent d'un couple de fonctions de sérialisation binaire.
 

Code :
  1. class objetN : public cbase
  2. {
  3. void serialisation( ofstream& fichier_destination )
  4. {
  5. cbase::serialisation( fichier_destination );
  6. /*** serialisation des membres spécifiques de objetN ***/
  7. }
  8. void deserialisation( ifstream& fichier_source );
  9. {
  10. cbase::deserialisation( fichier_source );
  11. /*** deserialisation des membres spécifiques de objetN ***/
  12. }
  13. /*** ...d'autres membres ici! ***/
  14. }


 
Quelle methode utiliseriez vous pour serialiser la liste en conservant l'information 'type' des objets pour reconstruire correctement la liste d'objets.
 
--edit : correction virtual;
 
Merci d'avance.  :jap:


Message édité par xterminhate le 07-06-2004 à 20:19:00

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 07-06-2004 à 18:51:50   

Reply

Marsh Posté le 07-06-2004 à 19:30:09    

Une sorte de header:
- type de l'objet
- version de l'objet (avec du binaire brut, c'est souvent préférable)
- longueur des données qui vont suivre pour cet objet

Reply

Marsh Posté le 07-06-2004 à 19:37:31    

Trame TLV en somme. Je cherchais une solution alternative mais je pense y arriver ainsi.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 07-06-2004 à 20:09:10    

et la virtualité bordel :o

Reply

Marsh Posté le 07-06-2004 à 20:15:55    

comment tu veux que ça marche sans ?

Reply

Marsh Posté le 07-06-2004 à 20:16:10    

et jeter un oeil à boost les moules :o

Reply

Marsh Posté le 07-06-2004 à 20:17:57    

Si tu parles de mon code en exemple, effectivement il y a une erreur. Cela dit, le lecteur aura corrigé de lui même. Concernant mon pb, aurais tu une solution plus séduisante que l'ecriture 'à la main' du type de l'objet dans le fichier ?


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 07-06-2004 à 20:19:03    

Taz a écrit :

et jeter un oeil à boost les moules :o

Reply

Marsh Posté le 07-06-2004 à 20:20:48    

Reply

Marsh Posté le 07-06-2004 à 20:23:21    

Je regarde, merci.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 07-06-2004 à 20:23:21   

Reply

Marsh Posté le 07-06-2004 à 21:55:20    

Faut accepter de perdre bcp de temps à installer boost pour esperer en gagner plus tard. Quelle daube l'install de boost.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 07-06-2004 à 22:52:15    

bah non : moi j'ai des paquetages, j'ai tout

Reply

Marsh Posté le 08-06-2004 à 08:43:23    

Taz a écrit :

bah non : moi j'ai des paquetages, j'ai tout


 
+1 :o

Reply

Marsh Posté le 08-06-2004 à 17:35:58    

Il faudrait que je les trouve pour win32. Bizarre, il me sort des erreur sur des types long long dans le code de boost. Je croyais que ca n'existait pas en C++.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 08-06-2004 à 18:16:53    

non ça n'existe pas officiellement : le commité ANSI a statué en 99 et introduit ce type , le C++ en 98, c'est juste une histoire de date : résultat le C99 a des long long définis sur le papier, le C++ les vole donc prudence ... les gars du C ont encore fait cavalier seul, mais la compatabilité sera bientôt officiell

Reply

Marsh Posté le 08-06-2004 à 18:27:31    

Probablement que la diffusion à grande echelle de micro 64bits devrait accelerer les choses.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 08-06-2004 à 19:38:02    

non : ça ne change rien : sizeof(long) == 8 sur une machine 6bits

Reply

Marsh Posté le 08-06-2004 à 19:43:13    

une machine 6 bits ???
8 bits tu voulais dire, non ?

Reply

Marsh Posté le 08-06-2004 à 19:44:53    

je sais plus, t'es pas capable de faire la déduction ?

Reply

Marsh Posté le 08-06-2004 à 19:46:30    

Taz, je parlais du support des long long (64 bits) qui pourront etre calculés par les nouveaux micro en un minimum de cycles...enfin je pense.
 
Bon, Boost commence à me chauffer serieusement. J'ai rebuildé les sources avec la config mingw et il me sort encore des erreurs dans le .hpp avec des long long. Tu n'as pas eu ce problème par hasard ?


Message édité par xterminhate le 08-06-2004 à 19:46:56

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 08-06-2004 à 19:48:24    

quand j'ai commencé à vouloir être sérieux, je m'en suis donné les moyens
 
sizeof(long) == 8 ça vous inspire donc rien ?
 
 
bref tout ça ne change rien, ça fait belle lurette qu'on a des types __int64 dans tous les sens

Reply

Marsh Posté le 08-06-2004 à 19:51:36    

C'est bon j'ai révisé ma table de multiplication ;) Effectivement ce que tu dis parait logique.
 
Et au sujet de boost, ca te dit rien ce genre de difficulté ?
 


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 08-06-2004 à 19:54:39    

non. montre le message d'erreur ... cela dit, c'est pas encore tout à fait officiel, alors ...

Reply

Marsh Posté le 08-06-2004 à 19:55:45    

Taz a écrit :

je sais plus, t'es pas capable de faire la déduction ?


Sissi ... 6x8 = 48  :o

Reply

Marsh Posté le 08-06-2004 à 19:56:34    

c'est donc que tu n'as rien compris à sizeof

Reply

Marsh Posté le 08-06-2004 à 21:34:04    

hmm .. sizeof long = 4 = sizeof int
 
sizeof __int64 = 8
 
sizeof char = 1, sizeof short = 2
s'pas bon ???

Reply

Marsh Posté le 08-06-2004 à 21:34:51    

Et j'oubliai sizeof long long = 8 probablement .. ;)

Reply

Marsh Posté le 08-06-2004 à 21:40:11    

non, t'as tout faux, sauf le sizeof(char) == 1 (mais saura tu pourquoi)
 
le reste est complètement dépendant de ton environnement, les types standards doivent juste obéirà quelques contraintes simple (comme un taille suffisante pour reprénsenter un interval de -n à +n)

Reply

Marsh Posté le 08-06-2004 à 21:45:30    

Non, je n'ai pas tout faux ...
Ou alors il faut me le prouver, ou bien ...  
Vi ... efectivement si tu programmes sur un ZX80 y a de forte chance que cela ne soit pas pareil ...
Désolé, je n'avais pas pensé à ça ...

Reply

Marsh Posté le 08-06-2004 à 21:47:03    

je crois que tu as une vision un peu trop réduite du monde non X86-32

Reply

Marsh Posté le 08-06-2004 à 21:53:25    

Possible, je n'ai programmé que sous x86 16 puis 32 bits, et bien avant sous motorola du 6809 au 68060 ( enfi récemment) ...  
- Le 6809 j'avoue ne pas me rappeler de tous les types ..
- Depuis ... je ne vois pas trop ...

Reply

Marsh Posté le 08-06-2004 à 22:00:14    

pense au monde 64 bits : PPC, X86-64, etc :o

Reply

Marsh Posté le 08-06-2004 à 22:15:26    

Quelle prise de tete ce boost. La lib serialization est livrée a part et necessite encore d'autres outils spécifiques.... franchement, faudrait qu'ils simplifient leur lib. C'est dommage!


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 08-06-2004 à 22:21:26    

franchement faudrait que t'apprennes à lire ; boost::serialization est en beta test.
 
après j'y peux quoi si tu travailles dans un environnement qui n'en a que le nom ...

Reply

Marsh Posté le 08-06-2004 à 22:25:11    

j'aurais peut etre moins de difficulté sur ma machine linux mais c'est un programme pour win32... j'y peux pas grand chose.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 08-06-2004 à 22:26:52    

nous non plus, boost non plus

Reply

Marsh Posté le 08-06-2004 à 22:29:08    

Ouais j'arrete de me plaindre! ;)
 
Au final, solution TLV. Rien de tres excitant mais ca marchera correctement.


Message édité par xterminhate le 08-06-2004 à 22:29:21

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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