OVH Cloud OVH Cloud

Serialisation

2 réponses
Avatar
unknow
Je cherche des informations sur le principe de serialisation. Non pas sur la
mise en pratique en MFC mais sur son codage integral.

Merci

2 réponses

Avatar
Samuel Krempp
le Thursday 02 October 2003 16:53, écrivit :

Je cherche des informations sur le principe de serialisation. Non pas sur
la mise en pratique en MFC mais sur son codage integral.


sur le principe de la sérialisation, ou de la sérialisation telle que
pratiquée 'en MFC' (qui serait HS, et done je ne connais rien) ?

en toute généralité, le principe est extrêmement simple : il s'agit de créer
une suite d'octets à partir d'un objet, et d'être capable plus tard de
faire l'inverse (re-créer l'objet à partir de la suite d'octets).

dans le détail, il n'y a pas de solution universelle.
il y a des méthodes qui permettent de sérialiser des objets à partir de la
seule liste de ses données membres sous certaines restrictions (le cas
échéant, à partir de code custom ajouté par l'utilisateur)

Pour des nombres et autres objets à sémantique de valeur, il y a des
solutions conceptuellement très simples qui permette de sérialiser sans
trop faire de choses soi-même, ie juste fournir une fonction membre qui
liste les membres données. ce qui peut s'exprimer par exemple avec le draft
de boost::serialization :

class Toto {
public:
int i,j;
template<class Archiver>
void describe(Archiver& ar) {
ar & i & j;
}
};
(ça suffit pour que la classe soit sérialisable)

Pour des pointeurs vers objets appartenant à une hiérarchie de classe
contenant éventuellement des pointeurs vers d'autres objets formant
éventuellement un graphe avec cycles, ça commence à devenir un peu dur mais
je crois que ce draft permet encore de sérializer simplement à partir d'une
fonction listant les données membres, comme celle de Toto.

Pour une classe completement zarbe, il pourrait être nécessaire de se taper
soi-même le code capable d'en sérialiser un objet au lieu de juste fournir
une fonction chargée de lister les membres de données.

exemple :
Toto {
int *p;
public:
Toto() : p( (new int(0)) + 2) {}
[..]

ne va pas être bien sérialisée par la simple fonction canonique ..
(juste pour bien souligner que dans l'absolu, il ne suffit pas de connaitre
toutes les données membres d'un objet pour le sérialiser)

--
Sam

Avatar
unknow
Mais alors quelles sont les noms des methodes mises en oeuvre ?
Connaissant le nom de ces dernieres, je pourrai sans doute trouver plus
d'info sur le NET.

Y-a-til des liens vers les infos theoriques sur la serialisation ?

Merci


"Samuel Krempp" a écrit dans le
message news: 3f7cb478$0$10405$
le Thursday 02 October 2003 16:53, écrivit :

Je cherche des informations sur le principe de serialisation. Non pas
sur


la mise en pratique en MFC mais sur son codage integral.


sur le principe de la sérialisation, ou de la sérialisation telle que
pratiquée 'en MFC' (qui serait HS, et done je ne connais rien) ?

en toute généralité, le principe est extrêmement simple : il s'agit de
créer

une suite d'octets à partir d'un objet, et d'être capable plus tard de
faire l'inverse (re-créer l'objet à partir de la suite d'octets).

dans le détail, il n'y a pas de solution universelle.
il y a des méthodes qui permettent de sérialiser des objets à partir de la
seule liste de ses données membres sous certaines restrictions (le cas
échéant, à partir de code custom ajouté par l'utilisateur)

Pour des nombres et autres objets à sémantique de valeur, il y a des
solutions conceptuellement très simples qui permette de sérialiser sans
trop faire de choses soi-même, ie juste fournir une fonction membre qui
liste les membres données. ce qui peut s'exprimer par exemple avec le
draft

de boost::serialization :

class Toto {
public:
int i,j;
template<class Archiver>
void describe(Archiver& ar) {
ar & i & j;
}
};
(ça suffit pour que la classe soit sérialisable)

Pour des pointeurs vers objets appartenant à une hiérarchie de classe
contenant éventuellement des pointeurs vers d'autres objets formant
éventuellement un graphe avec cycles, ça commence à devenir un peu dur
mais

je crois que ce draft permet encore de sérializer simplement à partir
d'une

fonction listant les données membres, comme celle de Toto.

Pour une classe completement zarbe, il pourrait être nécessaire de se
taper

soi-même le code capable d'en sérialiser un objet au lieu de juste fournir
une fonction chargée de lister les membres de données.

exemple :
Toto {
int *p;
public:
Toto() : p( (new int(0)) + 2) {}
[..]

ne va pas être bien sérialisée par la simple fonction canonique ..
(juste pour bien souligner que dans l'absolu, il ne suffit pas de
connaitre

toutes les données membres d'un objet pour le sérialiser)

--
Sam