IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Sérialiser un objet


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Par défaut Sérialiser un objet
    Bonjour,

    Je développe un jeu en C++. Je souhaiterais permettre au joueur de sauvegarder une partie dans un fichier, pour pouvoir la relancer plus tard.

    Pour cela je cherche un moyen de sérialiser l'objet "game" de mon programme, qui contient toutes les informations utiles au jeu (la map, etc).

    Quelle est la manière la plus simple de faire cela ? Avez-vous une lib à me conseiller ?

    Merci d'avance pour vos conseils !

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Pour tout ce qui est sauvegarde je conseille toujours sqlite. Pour "sérialiser" ta classe, je te conseille de réfléchir à ce que tu veux sauvegarder. Par exemple :

    - nom du joueur
    - nombre de points
    - niveau
    - objets dans son inventaire
    - etc...

    Ainsi, il te suffira de les stocker de cette façon. Tu créeras dans le fichier (ou dans la base si tu utilises sqlite), un champs nom et tu lui mettras une valeur. Quelque chose dans ce genre :

    player_name=imperio
    points=1245689
    level=42

    Pour les objets, vu qu'il y a plusieurs infos, tu pourrais faire de cette façon :

    object=id_object nombre_exemplaire_que_t_en_as

    object=4 18 //l'id correspond à fraise des bois et t'en as 18

    Et ainsi de suite.

  3. #3
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Regarde du coté de Boost.Serialization.
    Si tes classes sont relativement simples, un simple & entre l'«Archive» de Boost et tes différents membres est suffisant
    Si la classes est plus complexe, Boost.Serialization offre aussi ce qu'il faut pour les classes de la STL, référence, pointeur, polymorphisme...
    Boost.Serialization est simple (à utiliser), complet et portable

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    D'un autre côté, as tu besoin d'une lib pour faire ça ?
    La sérialisation est intéressante pour avoir un format de données indépendant du système, par exemple pour des données transférés sur réseau. C'est pas ton cas.
    Une base de données est bien pour faire des requêtes. Toi tu fais juste une lecture/écriture unique, pas des accès ou recherche durant l'exécution du programme.
    Une simple surcharge des opérateurs de flux (<< et >>) avec iostream me semble largement suffisant dans ton cas

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    J'aimerais pouvoir me passer d'une lib mais les objets que contient game sont un peu complexes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Camera              _camera; 
    std::list<AObject*> _objects;
    int                 size_map;
    Je vais regarder du coté de Boost. Si vous avez d'autres idées n'hésitez pas svp.

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,

    Dans ton cas très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Camera              _camera; 
    std::list<AObject*> _objects;
    int                 size_map;
    Il y a des choses à savoir sur ta classe dite "simple".
    1- Tu peux utiliser une fonction Serialize(flux ofstream ou objet qui écrira dans le fichier), ou surcharger l'opérateur <<
    2- Tu dois le faire pour l'objet Camera également et pour tout les objets sérialisable
    3- Tu ne peux pas sauvegarder des pointeurs ( l'adresse mémoire change a chaque instance de ton application), donc tu dois sauvegarder les datas des AObject* de ta list, et au chargement faire un new avec ces datas afin de recréer l'objet identique.

    Exemple de fichier de sortie .txt ou .sav ou extension que tu veux:

    #Camera
    0.2 0.3 0.4 #position
    0.0 0.0 0.0 #lookat
    #List
    10 #size
    {{datas AObjet, dataAObjet}} #Toutes les datas pour list<AObjet>
    #Sizemap
    999
    # sont les commentaires
    Ceci est un exemple pour que tu comprennes, il n'est en rien optimum ou irréprochable.
    Cordialement,

Discussions similaires

  1. Sérialisation d'objets sans Boost
    Par Alp dans le forum Boost
    Réponses: 7
    Dernier message: 24/09/2006, 11h43
  2. [POO] Sérialisation d'objet en PHP
    Par Invité(e) dans le forum Langage
    Réponses: 4
    Dernier message: 29/08/2006, 15h37
  3. Sérialisation d'objets en c++
    Par OxyLin dans le forum C++
    Réponses: 9
    Dernier message: 13/02/2006, 22h50
  4. [C#] Comment sérialiser un objet Font ?
    Par djmanu dans le forum C#
    Réponses: 5
    Dernier message: 20/01/2006, 09h51
  5. [Sérialisation] d'objets de types différents
    Par Amnesiak dans le forum Général Java
    Réponses: 3
    Dernier message: 08/12/2004, 22h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo