Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    C++Serializzazione

    Ciao! in c++ esistono classi di serializzazione che permettano la scrittura di un oggetto su file? se si quali? grazie!
    Powered by MacOSX Lion

  2. #2
    Se intendi nel linguaggio C++ direi di no...sicuramente qualche libreria in giro ci può essere ma comunque richiederebbe un tuo supporto nelle classi. Poi puoi sempre creartela da te
    Il modo più semplice sarebbe di implementare una interfaccia da usare in tutte le classi da serializzare, che so qualcosa del genere:
    codice:
      class clsSerializableObject
      {
      public:
         virtual bool SaveToStream(clsStream &strm) = 0;
         virtual bool LoadFromStream(clsStream &strm) = 0;
      };
    Poi serve un class factory per i tuoi oggetti, qualcosa del genere (e' solo abbozzato):
    codice:
       typedef clsSerializableObject *(*createCB)(DWORD id);
       class clsSerializableFactory
       {
       private:
         createCB *_object_creators[MAX_CLASSES];
         int _count;
       public:
         clsSerializableFactory(int mx)
         {
           _object_creators = new createCB[mx];
           memset(_object_creators, 0, sizeof(createCB) * mx);
           _count = 0;
         }
         void addCreator(createCB cb)
         {
           _object_creators[_count++] = cb;
         }
         clsSerializableObject *createObject(DWORD id)
         {
            clsSerializableObject *r = NULL;
            for( int i = 0; (i < _count) && !r; i++ )
            {
               r = _object_creators[i](id);
            }
            return r;
         }
       };
    Do' per scontato l'esistenza della classe clsStream con i metodi write(buff, sz), read(buff, sz).
    A questo punto se vuoi serializzare la classe clsCustom puoi fare:
    codice:
      class clsCustom : public clsSeriableObject
      {
      private:
         int _ini_member;
         int _array_size;
         char *_array_member;
      public:
         bool SaveToStream(clsStream &strm) { fai quello che devi }
         bool LoadFromStream(clsStream &strm) { fai quello che devi }
    
         static clsSerializableObject *creator(DWORD id)
         {
           if( id == 1 ) // Sono io.
             return new clsCustom(); // Devo avere un cstr di default anche protetto.
           else
             return NULL;
         }
      }
    A questo punto creiamo la classe che serializza:
    codice:
       class clsSerializator
       {
       private:
          clsSerializableFactory _fc;
       public:
          void loadObjects(clsStream &strm)
          {
            while( !strm.eof() )
            {
               DWORD tmp_id;
               strm.read(&tmp_id, sizefo(tmp_id));
               clsSerializableObject *tmp_obj = _fc.createObject(tmp_id);
               if( !tmp_obj )
                 break; // Stream errato.
               tmp_obj.LoadFromStream(strm);
            }
          }
          void writeObject(clsSerializableObject *obj)
          { // Magari occore un controllo che obj appartenga al factory..
             obj.WriteToStrema(strm);
          }
          clsSerializableFactory &factory() { return _fc; }
       };
    Poi per aggiungere clsCustom alle classi serializzabili:
    codice:
       clsSerializator tmp_ser;
       tmp_ser.factory().addCreator(clsCustom::creator);
    Ovviamente l'ho scritto di getto quindi non compila..ma può essere una traccia di come fare.
    (O almeno spero )


  3. #3
    grazie mille! ciao!
    Powered by MacOSX Lion

  4. #4
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    cosa significa serializzazione di oggetti su file? VVoVe:

  5. #5
    La serializzazione di oggetti su file è un modo di mantenere persistenti le informazioni sugli oggetti stessi. In pratica consente di salvare su un supporto persistente (file, DB, rete o atro) lo stato dell'oggetto (quindi i suoi membri).
    Il modo più banale sarebbe quello di fare una write su file dell'oggetto con write(obj, sizeof(obj)) ma questo non funziona se l'oggetto contiene riferimenti ad altri oggetti o puntatori ad altri oggetti o a memoria; se per esempio una stringa viene memorizza in un puntatore, la write salverebbe solo l'indirizzo del puntatore e non il suo contenuto. Quindi per serializzare un'oggetto occorre che l'oggetto stesso si occupi di salvarsi lo stato.


  6. #6
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    grazie per il chiarimento fastcoder

    però ci rimane una bella questione la teoria cè.... e cè tutta
    ma il tuo codice è materia da UFO

    ad esempio solo per curiosità
    cosa significa questa righa di codice :


    typedef clsSerializableObject *(*createCB)(DWORD id);



  7. #7
    La riga di codice dovrebbe essere la definizione di una callback...nella fattispecie un puntatore ad una funzione che accetta un DWORD e ritorna un puntatore ad un clsSerializableObject.
    L'ho usata per poter fornire al class factory (una fabbrica di oggetti) un modo per poter creare una classe concreta che implementa la classe clsSerializableObject.
    Per poter fornire tale callback ho dovuto creare il metodo creator di clsCustom come membro statico altrimenti il trucchetto delle typedef non funzionava (ci sta di mezzo il this).
    Non è il metodo più bello per risolvere il problema ma come avevo detto il codice che è scritto è solo un'idea...non so nemmeno se compila. Comunque credo che sia una traccia per provare a lavorarci su.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.