Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [c++]serializzazione

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]serializzazione

    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.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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.

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Se serializzi in binario non c'è alcuna sostituzione, se serializzi come testo ci sono alcune sostituzioni come il ritorno a capo...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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:
    codice:
    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....

  7. #7
    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:
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie 1000

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    ciao.
    Mi chiedevo se una semplice funzione template del tipo:
    codice:
    template<class T>
    serializza(T data)
    {
        os.write((char *) &data, sizeof(data));
    }
    non potesse risolvere molti problemi.

    ma per es. come gestire le stringhe?

  10. #10
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.