Serialization

Signaler
Messages postés
6
Date d'inscription
samedi 8 février 2003
Statut
Membre
Dernière intervention
31 octobre 2003
-
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003
-
Bonjour tout le monde,

Je suis débutant et je voudrais savoir s'il est possible de sauvegarder une classe dans un fichier (en CPP).
Si oui comment fait-on?

Est-ce qu'il est possible que quelqu'un m'explique ce qu'est la serialization et comment ça marche?

Je vous remercie d'avance pour vos réponses.

2 réponses

Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
8
bonjour à toi !
je pense que tu veux dire sauvegarder un objet, plutôt qu'une classe. Autrement dit, sauver les valeurs des attributs.
Pour cela, si tu fais des MFC, il existe la classe CDocument et sa fonction "serialize" qui prend en argument un objet CArchive dans lequel il suffit d'écrire les divers attributs de ton objet :
Serialize(CArchive& ar)
{ ar << attrib1 << attrib2;}

Sinon, il faut simplement décider d'une structure de stockage : par exemple, simplement mettre les valeurs des attributs dans l'ordre de leur déclaration et écrire ça dans un fichier.
L'opération inverse est la désérialisation et il est bon de faire le cycle suivant pour vérifier que tout est en ordre :
Créer l'objet, le sérialiser dans un fichier "obj.ser", créer un autre objet avec le Ctor par défaut et relire le fichier "obj.ser" pour affecter les valeurs des attributs au nouvel objet, comparer les deux objets => égalité.

Remarque :
en Java, la sérialisation est native et plus robuste, on stocke le nom de la classe, le type des attributs , leur noms et leur valeur y compris un numéro de version...
Messages postés
64
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
7 mars 2003

> Bonjour tout le monde,
>
> Je suis débutant et je voudrais savoir s'il est possible de
>sauvegarder une classe dans un fichier (en CPP).

Une classe est la *description*. Un *objet* est une variable qui correspond à cette description.

//une CLASSE
class A
{
// ...
};

//un OBJET
A monA;

> Si oui comment fait-on?

Il faut le faire à la mitaine. Tu dois utiliser std::ofstream pour écrire les informations dans un fichier (dans le format que tu voudras) et std::ifstream pour lire les informations stockées. Tu devras faire les affectations à la main aussi. Le C++ n'a pas de support direct pour la sérialization (contrairement au Java).

# include <string>
# include <fstream>

class maClasse
{
private:
int a, b, c;
std::string s1, s2;

public:
maClasse();

//serialize cet objet
serializer(std::string filename)
{
std::ofstream file(filename.c_str());

file << a << "\n" << b << "\n" << c << "\n";
file << s1 << "\n" << s2;

file.close();
}
};

int main()
{

maClasse monObjet;

//mettre des choses dans monObjet
// ...

//sérializer monObjet dans le fichier 'monObjet.ser'
monObjet.serializer("monObjet.ser");

}

Et voilà. Tu n'auras qu'à te faire une fonction deserializer() qui prendra, par exemple, une référence vers l'objet et le nom du fichier :

bool deserializer(maClasse &obj, std::string filename);

Ici, on ouvrira 'filename' et on stockera les informations dans 'obj'.

Pas si pire.

> Est-ce qu'il est possible que quelqu'un m'explique ce
>qu'est la serialization et comment ça marche?

Le fait de 'sauvegarder' l'état d'un objet de façon permanente (ou statique, comme tu veux). La désérialization est le fait de 'charger' l'état de ce même objet. Cette sérialization se fait beaucoup plus facilement en Java qu'en C++, car il existe une classe (nommée Serializable) dont il est possible d'hériter. Une classe implémentant l'interface Serializable peut être sérializé en deux ou trois appels de fonctions.

Le fonctionnement dépend de l'implémentation. En règle générale, lorqu'on sérialize un objet, on stocke les valeurs des attributs ainsi que leur type et un numéro d'identification de la classe à laquelle cet objet appartient, ce qui permet un checking beaucoup plus efficace.

> Je vous remercie d'avance pour vos réponses.

Plaisir.