PDA

Visualizza la versione completa : [c++]serializzazione


giuseppe500
09-01-2013, 11:44
ciao.
Devo creare un meccanismo di serializzazione semplice per un mio progetto.
non vorrei utilizzare pero' boost o mfc per problemi che esulano dal topic.
Qello che non mi è chiaro è se è meglio utilizzare un buffer che verrà fatto arrivare ad ogni funzione save di un oggetto base CBaseObject da cui derivano tutti (o quasi)gli oggetti del progetto o scrivere in modo sequenziale elemento per elemento sul file aperto (che sarà fatto arrivare alle funzioni save)e chiuderlo quando ho finito.
Con il buffer scriverei una volta per tutte su file alla fine, penso sia piu veloce.
chiedo.
grazie.

Scara95
09-01-2013, 21:07
Valuta tu l'approccio migliore attraverso alcuni test e valutando le specifiche della/e macchina/e target del programma.
In ogni caso, se decidi per un buffer, imposta una grandezza massima e scrivi sul disco quando si riempie...

giuseppe500
10-01-2013, 17:01
ok , grazie, faro come hai detto.
adesso parto dallo spazio richiesto e alloco un buffer di char di quella grandezza.
come faccio a scrivere un double o un valore di dato primitivo che occupa piu spazio?

ho la classe streamOut con alcune funzioni di utilità, adesso devo inserire una funzione

write(size,(void*)value)

ma se size è 4 ad es inserendo dei float non c'è problema , ma se è double come faccio?


Vado un po ot :ma che differenza c'è tra il binario e il testo come serializzazione intendo , vedo che moltissimi programmi serializzano in binario, quali sono i pregi e difetti(a parte che il binario non è leggibile da umano).
grazie.

Scara95
11-01-2013, 20:29
Se serializzi in binario non c'è alcuna sostituzione, se serializzi come testo ci sono alcune sostituzioni come il ritorno a capo...

MItaly
11-01-2013, 22:02
Più che altro, la serializzazione in binario è molto più veloce perché in genere corrisponde ad un semplice dump della memoria associata alla struttura da serializzare, mentre la serializzazione in formato testuale richiede la conversione di tutti i membri in una qualche rappresentazione testuale.

giuseppe500
20-01-2013, 19:54
grazie.
Ma dopo aver allocato un buffer della grandezza corretta di unsigned char(almeno penso) come mi comporto quando devo andare a scrivere i dati sul buffer?
per es i double dovrebbero occupare due unsigned char(o mi sbaglio).
Ho pensato di scrivere due funzioni del tipo:


WriteSingleData(unsigned char data);//per i dati che occupano un BYTE
WriteSingleData(double???);//e per i dati tipo double?????

che tipo posso utilizzare per i double?
o è meglio utilizzare sempre un void* ?
non so chiedo....

MItaly
20-01-2013, 22:16
Se fai una serializzazione "alla C" ti basta scrivere su file i tipi che ti interessano con una ostream::write; per scrivere un double sarebbe una cosa del genere:


double d=10.;
os.write((char *) &d, sizeof(d));


Nota comunque che serializzare in maniera così brutale va bene solo per i tipi POD.

Tra parentesi, ma nel tuo progetto mica usavi Qt? In tal caso, se non ricordo male Qt fornisce già di suo delle buone funzionalità di serializzazione, dacci un'occhiata.
:ciauz:

giuseppe500
21-01-2013, 16:42
grazie 1000 :ciauz:

giuseppe500
22-01-2013, 15:10
ciao.
Mi chiedevo se una semplice funzione template del tipo:


template<class T>
serializza(T data)
{
os.write((char *) &data, sizeof(data));
}

non potesse risolvere molti problemi.

ma per es. come gestire le stringhe?

MItaly
22-01-2013, 15:33
Può essere usata, ma, come già detto prima, ha senso solo per i tipi POD e senza puntatori - e infatti per le stringhe dovrai fare un overload a parte. Ma, di nuovo, esistono già diverse librerie di serializzazione, non stare a reinventare la ruota. :stordita:

Loading