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 )