2010-01-24 15 views
8

Esiste qualcosa di simile alla serializzazione Java/.NET per C++?È possibile serializzare automaticamente un oggetto C++?

+2

No perché C++ non ha il riflesso di runtime. Vedi la risposta di sths per una buona alternativa. –

+2

Duplicato di http://stackoverflow.com/questions/1810372/c-serialization-library-that-supports-partial-serialization e http://stackoverflow.com/questions/1809670/how-to-implement-serialization-in -c e http://stackoverflow.com/questions/234724/how-to-serialize-in-c e molti altri trovati con la scoraggiante e complicata ricerca http://stackoverflow.com/search?q=c%2B% 2B + serializzazione + libreria – dmckee

risposta

12

Boost contiene serialization library. Non l'ho usato da solo, ma di solito le librerie di boost funzionano abbastanza bene.

+6

mentre rispondi alla domanda nel corpo, non hai risposto alla domanda nel titolo - che è la più interessante –

+0

La risposta alla domanda nel titolo è: No, C++ non automaticamente serializza i tuoi oggetti. – sth

6

Sfortunatamente non esiste un modo automatico per serializzare gli oggetti in C++. Questo perché qualsiasi motore di serializzazione deve essere in grado di "capire" il proprio oggetto personalizzato in fase di esecuzione e C++ non contiene le informazioni necessarie a tale scopo. Java e .Net dall'altra parte hanno, come si chiama, Reflection. Questo meccanismo consente a chiunque di esplorare la struttura dei dati di qualsiasi oggetto arbitrario nel tempo di esecuzione.

Tutto ciò non significa che non sia possibile serializzare un oggetto C++ con uno sforzo relativamente ridotto. Prendiamo ad esempio la libreria standard di flussi C++. Scrivendo

int x = 2010; 
cout << x << endl; 

si serializza effettivamente un oggetto di tipo int. È possibile estendere questo meccanismo per supportare anche la tua classe personalizzata. Questo viene fatto semplicemente sovraccaricando l'operatore < <. Non è bello come la serializzazione Java, ma è anche molto conveniente.

Ci sono anche alcune librerie che lo rendono ancora più semplice. Come qualcuno ha già detto, boost serialization library fa un buon lavoro. Lavorare con la serializzazione boost sembra molto simile a lavorare con iostream ma risolve alcuni problemi inerenti agli stream standard.

3

Google protocol buffers fornisce un'implementazione C++ nel pacchetto principale; come un vantaggio, è possibile condividere questi dati con lots of other languages - ma si sarà limitati a utilizzare i tipi generati anziché il proprio (che alcuni motori di serializzazione supportano in altre lingue).

In realtà questo non è un problema, in quanto (se necessario) è sufficiente considerare i tipi generati come un DTO gemello con gli oggetti di dominio effettivi .

3

Boost.Serialization è una libreria molto buona e supporta anche il controllo delle versioni di base - qualcosa che non è mai del tutto possibile con la serializzazione automatica. Poiché mi è capitato di avere bisogno di versioni di versioni ancora migliori, in realtà ho scritto la mia libreria di serializzazione che segue lo stile Boost.Serialization (perché l'autore di Boost.Serialization non era interessato a migliorarlo).

Si noti che è possibile anche abusare delle funzioni di serializzazione per altri scopi come la GUI o la generazione di moduli Web, se viene aggiunto un po 'di dati di supporto (vedere come Boost.Serialization fa XML).

Occorre notare che il metodo popolare di salvataggio di intere strutture (convertendolo in char * e scrivendo sizeof (struct) byte) è completamente non modificabile, non supporta il controllo delle versioni e si interrompe se la struttura contiene puntatori o oggetti C++ (non POD).

1

Con un sacco di lavoro manuale (in realtà, implementando il proprio RTTI intrusivo o non intrusivo) si può raggiungere un livello di automazione paragonabile a C#/Java.

Vedere le informazioni dettagliate qui:

How to implement serialization in C++

1

Ho usato con successo questo:

http://uscilab.github.io/cereal/

e ha funzionato bene per me su entrambi iOS e Android. È una libreria di sola intestazione e non ha dipendenze esterne, quindi è estremamente comoda da usare. L'ho preferito più che altro perché non volevo importare tutte le dipendenze di boost. La libreria è piccola e supporta entrambi i formati di serializzazione XML, JSON, binari e personalizzati.

La libreria (come boost) richiede la scrittura esplicita di alcuni codici serialiazion e de-serialization per le classi base, mentre le raccolte vengono gestite automaticamente.

Problemi correlati