OVH Cloud OVH Cloud

Serialisation

4 réponses
Avatar
Eric
Bonjour

J'aimerai enrgistrer un objet dans un fichier !
Or j'aimerai savoir si dans la classe de cet objet, j'ai defini un autre
objet (genre String), est ce que cet objet sera aussi copier dans le fichier
ou est ce qu'il n'enrgistrera que le pointeur ?

Cordialement,

Eric

4 réponses

Avatar
Fabien LE LEZ
On Tue, 8 Jun 2004 00:23:20 +0200, "Eric"
wrote:

J'aimerai enrgistrer un objet dans un fichier !


Fort bien. Cf
<http://www.google.com/groups?as_q=s%C3%A9rialisation&safe=images&ie=UTF-8&as_ugroup=fr.comp.lang.c%2b%2b&lr=&hl=en>.

Or j'aimerai savoir si dans la classe de cet objet, j'ai defini un autre
objet (genre String), est ce que cet objet sera aussi copier dans le fichier
ou est ce qu'il n'enrgistrera que le pointeur ?


Ça dépend de la méthode de sérialisation.

Si jamais tu emploies la "méthode C", i.e. enregistrer les octets tels
qu'ils sont dans la RAM, ça ne marchera pas[*].

[*] Si l'objet en question est un POD[**], et que tu utilises un seul
compilateur sur un seul OS, ça peut marcher, mais même ça n'est pas
garanti -- sauf peut-être par le compilateur en question, mais en tout
cas pas par la norme.

[**] Si tu ne sais pas ce qu'est un POD :
<http://www.google.com/groups?as_q=pod&safe=images&ie=UTF-8&as_ugroup=fr.comp.lang.c%2b%2b&lr=&hl=en>

--
;-)
FLL, Epagneul Breton

Avatar
kanze
Fabien LE LEZ wrote in message
news:...

[...]
Si jamais tu emploies la "méthode C", i.e. enregistrer les octets tels
qu'ils sont dans la RAM, ça ne marchera pas.


Ce n'est pas le méthode C. En fait, en C, on faisait exactement comme on
fait en C++. À l'exception près que c'était dans une fonction globale,
et non une fonction membre.

La méthode, quelque soit le langage en question, est toujours de définir
la sérialisation sur un nombre de types élémentaire (char, long,
unsigned long, double, std::string, par exemple), puis de définir la
sérialisation des types plus compliqués par une application récursives
jusqu'à ce qu'on arrive à un des types primitifs ou un type qui peut se
convertir en un des types primitifs.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Loïc Joly
wrote:

La méthode, quelque soit le langage en question, est toujours de définir
la sérialisation sur un nombre de types élémentaire (char, long,
unsigned long, double, std::string, par exemple), puis de définir la
sérialisation des types plus compliqués par une application récursives
jusqu'à ce qu'on arrive à un des types primitifs ou un type qui peut se
convertir en un des types primitifs.


On peut voir en particulier boost::serialization, qui pour les cas
complexes permet de définir tout ça assez simplement.

Il existe aussi des langages proposant une sérialisation par défaut d'un
type, grace en général à un mécanisme d'introspection. Ce n'est pas le
cas du C++.

--
Loïc

Avatar
kanze
Loïc Joly wrote in message
news:<ca57j9$19f$...
wrote:

La méthode, quelque soit le langage en question, est toujours de
définir la sérialisation sur un nombre de types élémentaire (char,
long, unsigned long, double, std::string, par exemple), puis de
définir la sérialisation des types plus compliqués par une
application récursives jusqu'à ce qu'on arrive à un des types
primitifs ou un type qui peut se convertir en un des types
primitifs.


On peut voir en particulier boost::serialization, qui pour les cas
complexes permet de définir tout ça assez simplement.

Il existe aussi des langages proposant une sérialisation par défaut
d'un type, grace en général à un mécanisme d'introspection. Ce n'est
pas le cas du C++.


Dans la pratique, faire une sérialisation convénable sans l'intervention
du programmeur me semble pas trop faisable. L'introspecition peut y
aider, mais il y a toujours des questions dont le programmeur est le
seul à avoir la réponse. Par exemple, si mon objet contient (au niveau
fondamental du C++) un T*, est que l'objet qu'il désigne fait partie de
mon objet ou non ? Voire même, dans le cas de std::string ou de
std::vector, est-ce que la capacité fait partie de ce qu'on sérialise ou
non ?

Note aussi qu'on pourrait avoir des réponses différentes selon que la
sérialisation sert à la persistence ou pour transmettre l'objet à un
autre processus ou machine. La solution Java, où on marque certains
éléments comme « transient » a donc ses limites, et n'est pas une
solution adéquate non plus.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34