Esiste qualcosa di simile alla serializzazione Java/.NET per C++?È possibile serializzare automaticamente un oggetto C++?
risposta
Boost contiene serialization library. Non l'ho usato da solo, ma di solito le librerie di boost funzionano abbastanza bene.
mentre rispondi alla domanda nel corpo, non hai risposto alla domanda nel titolo - che è la più interessante –
La risposta alla domanda nel titolo è: No, C++ non automaticamente serializza i tuoi oggetti. – sth
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.
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 .
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).
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:
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.
- 1. Come serializzare/non serializzare un oggetto SimpleXML?
- 2. Serializzare un oggetto in XML
- 3. Utilizzo di C# per serializzare un oggetto deserializzabile Java
- 4. Perché non è possibile serializzare una tupla in C#?
- 5. è possibile convertire un oggetto dinamico in un ExpandoObject (C#)
- 6. Perché è necessario serializzare l'attributo per un oggetto serializzato
- 7. Come serializzare QUALSIASI Oggetto in un URI?
- 8. È possibile serializzare la funzione std ::?
- 9. È possibile completare automaticamente un EditTextPreference?
- 10. Come serializzare un oggetto che include BufferedImages
- 11. non possibile serializzare/Deserialize ArrayList
- 12. Serializzare un oggetto su JSON, XML, YAML?
- 13. È possibile creare un oggetto senza una classe in C#?
- 14. È possibile eseguire il ciclo di un oggetto Classe C#?
- 15. Serializzare un oggetto di richiesta usando JSON
- 16. PDOException: non è possibile serializzare o unserializzare istanze PDO
- 17. E 'possibile serializzare un array alla radice di un oggetto con Serializer JMS?
- 18. È possibile ispezionare un singolo oggetto nodo?
- 19. È possibile serializzare la variabile oggetto Javascript e archiviare nei cookie?
- 20. : impossibile serializzare un oggetto proveniente da un altro assieme
- 21. Quando l'istanziazione di un oggetto Java è un oggetto della classe genitore creato automaticamente?
- 22. C# serializzare decimale xml
- 23. scoprire se un oggetto C++ è richiamabile
- 24. Serializzare un oggetto .net ed omettere il doctype?
- 25. È possibile generare automaticamente progetti Xcode?
- 26. È possibile avere un oggetto funzione come elemento
- 27. È possibile installare automaticamente un'app Android ed eseguire un aggiornamento?
- 28. In Protobuf-net, è possibile serializzare le classi non decorate?
- 29. Come serializzare o deserializzare un oggetto JSON in una certa profondità in C#?
- 30. È possibile serializzare Json.NET per lo streaming con Formattazione?
No perché C++ non ha il riflesso di runtime. Vedi la risposta di sths per una buona alternativa. –
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