Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Ma première sérialisation d'objet [ Divers / Débutant(e) ] (jex0519)

vendredi 5 décembre 2008 à 09:59:37 | Ma première sérialisation d'objet

jex0519

Bonjour à tous,

Je suis débutant en c++, et j'ai un projet ou je dois sauvegarder mes objets afin de pouvoir les recharger après...

Je voulais savoir comment celà ce passe en C++ pour la sérialisation d'objet??

Merci d'avance!

voici un exemple de mes classes:

class Administrateur : public Personne
{
    public:
        // class constructor
        Administrateur(string nom, string prenom, string username, string password);
        virtual void affiche();
        // class destructor
        ~Administrateur();
};
-----------------------
class Equipe
{
     
    private:
   
    string nomequipe;
    int bonusFifa;
    double coefFifa;

    public:
        // class constructor
        Equipe();
        Equipe(string nomequipe, int bonusFifa, double coefFiFA);
        string getNomEquipe(){return nomequipe;}
        int getBonusFifa(){return bonusFifa;}
        double getCoefFifa(){return coefFifa;}
        ~Equipe();
};
-----------------------
class Joueur : public Personne
{
    protected:
        double capital;
        string compte;
    public:
        // class constructor
        Joueur(string nom="", string prenom="", string username="", string password="", double capital=0.0, string compte="");
        virtual void affiche();
        virtual string getNom();
        virtual string getPrenom();
        virtual string getUsername();
        virtual string getPassword();
        virtual double getCapital();
        virtual string getCompte();
       
        // class destructor
        ~Joueur();
};
----------------------
class Match
{
    private:
           
    Equipe *domicile;
    Equipe *exterieure;
    int scoreEquipeA, scoreEquipeB;
   
    public:
        // class constructor
        Match(Equipe *d,Equipe *e, int scoreEquipeA, int scoreEquipeB);
        // class destructor
        Equipe* getDomicile(){return domicile;}
        Equipe* getExterieure(){return exterieure;}
        int getScoreEquipeA(){return scoreEquipeA;}
        int getScoreEquipeB(){return scoreEquipeB;}
        ~Match();
};
--------------------------
class Personne
{
       
        protected:
               string nom,prenom,username,password;
        public:
              
               Personne(string nom, string prenom, string username, string password);
               virtual void affiche();
               virtual string getNom();
               virtual string getPrenom();
               virtual string getUsername();
               virtual string getPassword();
              
               // class destructor
               virtual ~Personne();
};

vendredi 5 décembre 2008 à 11:01:52 | Re : Ma première sérialisation d'objet

Polack77

Salut ,

Alors la serialisation en Dot.Net c'est tout simple (perso du coup je n'es plus le moindre ini dans mes dév. Je sauvegarde mes config/obj/... avec la serialisation )

Petite explication :
Pour faire de la serialisation il faut plussieur chose :
-> 1ér étape note tes objet comme seralisable (<Serializable()> en début de déclaration de tes structure/classe)
-> Sauvegarde d'un objet seralisable :
  -> ouvre un stream fichier (System.IO.FileStream)
  -> Cree un serialiseur (System.Runtime.Serialization.Formatters.Binary.BinaryFormatter)
  -> Ecit dans le fichier
-> Lecture d'un fichier serialisé
  -> ouvre un stream fichier (System.IO.FileStream)
  -> Cree un serialiseur (System.Runtime.Serialization.Formatters.Binary.BinaryFormatter) (Sa me rapel un truc )

De petit exemple VB.NET et strucure mais tres simple à traduire (fonctionement identique pour une classe):
Déclaration de la structure (ou classe)
<Serializable()> Public Structure S_ConfigGenerale
        Public DossierDonnees As String
        '[...]
    End Structure
Déclaration de l'objet à serialisé (rien de particulier en faite ici )
Public ConfigGenerale as S_ConfigGenerale

Fonction de sauvegarde :
Public Sub SauveConfig()
        Dim AccesseurAuFichier As New System.IO.FileStream("C:\NomDuFichierDeSauvegade.sav", IO.FileMode.OpenOrCreate)
        Dim Formateur As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        Formateur.Serialize(AccesseurAuFichier, ConfigGenerale)
        AccesseurAuFichier.Close()
    End Sub

Fonction de lecture :
    Public Sub LoadConfig()
        Dim AccesseurAuFichier As New System.IO.FileStream("C:\NomDuFichierDeSauvegade.sav", IO.FileMode.Open)
        Dim Formateur As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        ConfigGenerale = Formateur.Deserialize(AccesseurAuFichier)
        AccesseurAuFichier.Close()
    End Sub

Voila avec sa tu ne peut pas avoir encore des problèmes de serialisation (par contre à tu réelement cherché des tuto sur ce site av de possé cette question ??? Je suis sur que non, et c'est MAL !!!!! )

PS :
Tu peut serialisé plussieur objet dans le même ficheir.
Ex :
Public Sub SauveConfig()
        Dim AccesseurAuFichier As New System.IO.FileStream("C:\NomDuFichierDeSauvegade.sav", IO.FileMode.OpenOrCreate)
        Dim Formateur As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        Formateur.Serialize(AccesseurAuFichier, ConfigGenerale)
        Formateur.Serialize(AccesseurAuFichier, ConfigSpe)
        Formateur.Serialize(AccesseurAuFichier, ObjALaCon)
        AccesseurAuFichier.Close()
    End Sub

    Public Sub LoadConfig()
        Dim AccesseurAuFichier As New System.IO.FileStream("C:\NomDuFichierDeSauvegade.sav", IO.FileMode.Open)
        Dim Formateur As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        ConfigGenerale = Formateur.Deserialize(AccesseurAuFichier)
        ConfigSpe = Formateur.Deserialize(AccesseurAuFichier)
        ObjALaCon = Formateur.Deserialize(AccesseurAuFichier)
        AccesseurAuFichier.Close()
    End Sub

Dans ce cas ATTENTION aux obj. à nothing. A valider mais il me semble que sa posse des problèmes.

Bonne prog

Amicalement
Pensez "Réponse acceptée"


vendredi 5 décembre 2008 à 11:03:38 | Re : Ma première sérialisation d'objet

Polack77

Et n'écris pas si GROS. Ton post est désagréable à lire du coup .

Amicalement
Pensez "Réponse acceptée"


vendredi 5 décembre 2008 à 12:22:06 | Re : Ma première sérialisation d'objet

Polack77

Heeeeeee cela répond t'il à ta question ?
Si oui pense réponse acceptée (cela permettras à d'autre qui se pose la même question de trouvé la réponse plus facilement .
Si non te reste t'il des questions (sur le même sujet par contre ) ?

Tiens, je remarque que il n'y à pas de tuto sur la sérialisation dans cppfrance ????? Désolé pour ma remarque j'étais certain du contraire (mais une tite rechérche dans Google t'aurais permit de trouvé tout de suite , deux gros avantages : en générale les réponses sont plus précises et tu n'a pas à attendre d'éventuel réponse qui parfais n'arrive jamais en plus . J'ai recherché dans Google "sérialisation c#" et 1ér réponse : ici , ce tuto est même plus péris que ma réponse )

Amicalement
Pensez "Réponse acceptée"

vendredi 5 décembre 2008 à 15:06:45 | Re : Ma première sérialisation d'objet

jex0519

LoL.. Oui j'avais fait des recherches sur google et sur cppfrance avant de faire ce poste évidement..

Mais malheureusement comme je suis un bon gros débutant je n'ai rien trouvé d'assez claire pour y comprendre quelque chose.   C'est pourquoi j'ai créé ce poste, mais les exemples que tu me donnes en VB.NET et C# sont trop flous pour moi qui débute la programmation en C++. J'aurais besoin de quelque chose de plus claire et en C++...

Merci pour ton aide

vendredi 5 décembre 2008 à 16:17:43 | Re : Ma première sérialisation d'objet

Polack77

Je n'es pas été claire
Haaaa......... Je vais faire mieux (déjà sa sera du C#, et du pas à pas)

Alors pour sérialisé un "truc" (objet, structure, ...) il faut plusieurs chose :
(1)
Déjà il faut que tu note tes class comme sérialisable (sa on ne peut pas faire autrement). Il siffi d'ajouté "<Serializable()>" à la déclaration de ta classe. ATTENTION il faut que tu l'ajoute à TOUTE les déclaration (normalement VisualStudio retourne une erreur si tu en oublie )

Exemple :
        [Serializable]
        class Personne
        {
//[...]
        }


        [Serializable]
        class Administrateur : Personne
        {
//[...]
        }


Tiens pk avais tu ajouté "public" dans ces déclarations ????

(2)
Il faut un "truc" qui te permet de lire/écrire dans un fichier. Pour cela on crée un objet "FileStream" (car c'est ce dont on à besoin pour la suite si non il existe aussi d'autre stream plus spécifique mais on ne les véra pas. C'est sans utilité ici)

Déclaration :
System.IO.FileStream AccesseurFichier;

Init de ton obj :
AccesseurFichier = new System.IO.FileStream("C:\\FichierSerialiser.dat",System.IO.FileMode.OpenOrCreate);

Pressions :
-> "C:\\FichierSerialiser.dat" est à remplacé par le nom du fichier dans le quel tu veut sauvegarder ton obj.
-> En C# les '\' doivent être doublé dans les chaine écrite en dur (soit direct dans le code prog).
-> Le mode d'ouverture correspond à ce que tu veut faire (ici ouvrir ou crée le fichier, on est plutôt dans un mode d'écriture du coup , pour lire il vaut mieux être en mode "System.IO.FileMode.Open" qui retourne une erreur si le fichier est abs, vue plus bas, pas de stress )

(3)
Ensuite il te faut un "truc" capable de transformé en une suite de nombre binaire l'objet que tu veut sérialisé. C'est la classe "BinaryFormatter" qui s'en charge (elle ne sait faire que sa, enfin je crois ). La même classe est utilisé pour re-transformé ta suite de valeur binaire en objet.

Déclaration :
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Formatteur;

Init de l'obj :
Formatteur = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

Utilisation en sérialisation (pour cela j'admét qu'un obj Admin basé sur la classe administrateur à été déclaré, on utilise un FileStream pour l'acces au fichier (2) ) :
Formatteur.Serialize(AccesseurFichier, Admin);

Utilisation en Déserialisation (toujour pour ce même obj Admin) :
Admin = Formatter.Deserialize(AccesseurFichier);

Fin
Voila déjà on à passé en revue toute les spé

Maintenant un Exemple :
Fonction d'écriture de deux obj dans un fichier (Admin et Perso) :
public Boolean SauveObjDansFichier (string CheminFichier,Administrateur Admin,Personne Perso)
        {
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Formatteur;
            System.IO.FileStream AccesseurFichier = null;
            try //<- Démarage de la gestion d'erreur (même si ici aucune erreur ne devrais se produire, sauf si par exemple on demande de crée en fichier en "g:" et que ce lecteur n'existe pas)
            {
                AccesseurFichier = new System.IO.FileStream(
CheminFichier, System.IO.FileMode.OpenOrCreate); //ici OpenOrCreate car on écrit donc si le fichier n'existe pas on le cré
                Formatteur.Serialize(AccesseurFichier, Admin);
                Formatteur.Serialize(AccesseurFichier, perso);
                AccesseurFichier.Close(); //Fini plus qu'à fermer le ficheir ;)
                AccesseurFichier = null;
                return true;
            }
            catch (Exception) //<- Le code passe ici en cas d'erreur
            {
                if (AccesseurFichier != null) //<- Si le fichier est encore ouvert on le ferme 
(si non sa pourais possé des problèmes pour plus tard)
                {
                    AccesseurFichier.Close;
                }
                return false;
                throw;
            }


Fonction de lecture de ces même obj :
public Boolean LoadObjDepuisFichier(string CheminFichier, ref Administrateur Admin,ref Personne Perso)
        {
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Formatteur;
            System.IO.FileStream AccesseurFichier = null;
            try //<- Démarage de la gestion d'erreur
            {
                AccesseurFichier = new System.IO.FileStream(
CheminFichier, System.IO.FileMode.Open); //Ici open car on lit donc on ne veut pas crée de fichier si il n'existe pas ;)
                &Admin = Formatteur.Deserialize (AccesseurFichier);
                &Perso = Formatteur.Deserialize (AccesseurFichier);
                AccesseurFichier.Close(); //Fini plus qu'à fermer le ficheir ;)
                AccesseurFichier = null;
                return true;
            }
            catch (Exception) //<- Le code passe ici en cas d'erreur (le fichier n'existe pas par exemple)
            {
                if (AccesseurFichier != null) //<- Si le fichier est ouvert on le ferme (si non sa pourais possé des problèmes pour plus tard)
                {
                    AccesseurFichier.Close;
                }
                return false;
                throw;
            }
        }


Une petite présision pour cette fonction :
Cette fonction (Load...) utilise un passage par référance ce qui veut dire que si tu modifie Admin alors c'est en faite la variable passé que se voie modifier (identique à ByRef en VB.NET)


Voila je ne voie pas comment être plus claire si un point précis te pose encore problème demande je n'aurais plus le temps de refaire un truc complet

Bonne prog

Amicalement
Pensez "Réponse acceptée"


vendredi 5 décembre 2008 à 16:20:14 | Re : Ma première sérialisation d'objet

Polack77

Oups un oublie de trad du VB.NET au C# il faut lire :
Déjà il faut que tu note tes class comme sérialisable (sa on ne peut pas faire autrement). Il siffi d'ajouté "[Serializable]" à ...

Et non
Déjà il faut que tu note tes class comme sérialisable (sa on ne peut pas faire autrement). Il siffi d'ajouté "<Serializable()>" à ...

Dzl

Amicalement
Pensez "Réponse acceptée"


vendredi 5 décembre 2008 à 16:24:44 | Re : Ma première sérialisation d'objet

Polack77

Re-oups bug à la ligne :
Formatteur.Serialize(AccesseurFichier, perso);
Le C# (comme le C) est sensible à la casse donc il faut :
Formatteur.Serialize(AccesseurFichier, Perso);

Amicalement
Pensez "Réponse acceptée"


vendredi 5 décembre 2008 à 16:40:00 | Re : Ma première sérialisation d'objet

Polack77

Oupsssssssssssss tu veut du C++ et non pas du C#
Je ne sait pas faire en C++ (je ne sait même pas si c'est possible je ne l'es jamais fait )

A l'époque je sauvegardais mes données dans des fichier ini en utilisant les API windows
Je ne peut que t'envoiler là :
http://www.cppfrance.com/code.aspx?ID=9349


Amicalement
Pensez "Réponse acceptée"


vendredi 5 décembre 2008 à 16:43:17 | Re : Ma première sérialisation d'objet

Polack77

Décidément c'est ma journée des oublies :
Si non tu à la possibilité de récup une version de Visual Stuido 2008 la :
http://msdn.microsoft.com/fr-fr/express/aa975050.aspx
Normalement il est compatible au C++ et devrais pouvoir convertir automatiquement ton projet (je dit bien logiquement ce n'es pas parfait non plus, hélasse )

Amicalement
Pensez "Réponse acceptée"



1 2

Cette discussion est classé dans : int, string, class, virtual, equipe


Répondre à ce message

Sujets en rapport avec ce message

multi heritage [ par foxz ] Bonjour,d'une maniere general.class strm{ // base stream virtual int w(void*,int)=0; // write virtual int r(void*,int)=0; //read};class fil:virtual pu class A:public int ??? [ par foxz ] J'ai besoin de faire ca : class A:public int{}; mais ca ne marche pas. (ni avec float) En fait, je veux cree une class ressemblant a un int mais j'a truc interessant pour les debutants [ par foxz ] ma question : est-ce portable ?ya t-il une autre solution ?non je ne demanderais pas si c safe thread :-))) (a priori ca l'est)class A{   int hidden;  Comment faire pour qu'un string soit egal a un int? en c++ [ par ndubien ] Salut, Comment faire pour qu'un string soit egal a un int? (en c++)int nombre(1);Je veux que :string a soit egal a "mot1" + nombre + "mo convertir un int en un String et l'inverse [ par ryoussef19 ] Bonjour,je travaille avec Visual Studio 2005 , comme langage visual c++ je peux convertir un int16, int32, ou un int 64 en un string ou l'inverse ..ma Fonctions Imbriquées avec argument string [ par Zakata ] Bonjours,J'esaye de programmer deux classes de menu. L'architecture est la suivantes : Une classe Menuclass Menu{public:    Menu(void);    ~Menu(void) Comment déclarer une interface en C++ [ par Giles314 ] Bonjour,Ma question est quelque peu théorique car j'ai une solution mais qui ne me semble pas "pure".Ce que j'appelle une interface est une spécificat convertir int en string [ par wasaikos ] salut a toustout est dans le titre mais je vous mache le travail voici ma fonction:string fonction(int chiffre){    string lettre="P";    string lettr convertir string en int [ par wasaikos ] salut a tous,tout est dans le titre mis e vais être plus précis, ce que j'ai besoin de faire c'est de convertir une variable de type string en une var


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,702 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.