Salut,
lors de la sérialisation je perd l'adresse des objets en sauvegardant les objets dans un fichier ou bien en les envoyant d'une machine à l'autre.

Et je crois pas que lorsque j'initialise un pointeur sur un objet d'une classe C appartenant à une classe A (en lisant l'objet C à partir d'un fichier), le pointeur sur ce même objet appartenant à la classe B est mis à jour.

Car il faut affecter le pointeur avec l'opérateur& pour lui assigner l'adresse de l'objet, hors, je n'ai pas l'adresse car elle a été détruite à la fermeture du programme ou bien elle est sur une autre machine.

Je me demande donc quel est le meilleur système pour ne pas désérialiser et sérialiser deux fois le même objet.

J'ai eu l'idée de faire une variable statique qui défini le nombre d'objets sérialiser, et j'incrémente cette variable à chaque fois que je sérialize un id, cet objet me sert d'id pour les objets et l'idée est la suivante :

Si deux objets ont la même adresse, alors, ils ont aussi le même id, si ils ont le même id j'écris juste l'id de l'objet dans le fichier, sinon, j'écris l'id et l'objet, ça m'évite de devoir sérializer deux fois le même objet, mais je dois aussi pouvoir vérifier si l'objet à déjà été sauvé, pour cela je sauvegarde l'id de l'objet et l'adresse de l'objet dans une map et je recherche l'adresse de l'objet que je veux sérialiser, comme ceci :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
template <typename T>
    void operator& (T* data) {
        std::map<unsigned long long int, unsigned long long int>::iterator it = adresses.find(data);
        if (it != adresses.end()) {
            buffer<<it->second;
        } else {
            std::pair<unsigned long long int, unsigned long long int> newAddress (data, nbSerialized);
            adresses.insert(newAddress);
            buffer<<newAddress.second;
            buffer<<*data;
        }
        nbSerialized++;
    }

Lors de la lecture, je fais un peu l'inverse :

Je lis l'id de l'objet sérialisé, si il est présent dans la map, ça veut dire que l'objet à déjà été lu, donc, je recherche l'adresse de l'objet et j'affecte le pointeur, sinon, j'alloue l'objet, je le lis et je sauvegarde son id et son adresse dans la map :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
template <typename T>
    void operator& (T* data) {
        unsigned long long int id;
        buffer>>id;
        std::map<unsigned long long int, unsigned long long int>::iterator it = adresses.find(id);
        if (it != adresses.end()) {
            data = it->second;
        } else {
            data = new T();
            buffer>>*data;
            std::pair<unsigned long long int, unsigned long long int> (id, data);
            adresses.insert(id, data);
            nbDeserialized++;
        }
    }

Je comptes le nombre d'objets désérialisés ici pour voir si ça marche bien, si ça marche bien,le nombre d'objet désérialisé doit être différent du nombre d'id sérialiser si deu classe contiennent un pointeur vers le même objet.