2010-11-10 11 views
11

Qualcuno sa di una funzionalità di "livello linguistico" per il decapaggio in C++? Non voglio qualcosa come la serializzazione Boost o i buffer del protocollo Google. Invece, qualcosa che potrebbe serializzare automaticamente tutti i membri di una classe (con un'opzione per escludere alcuni membri, o perché non sono serializzabili, o perché semplicemente non mi interessa salvarli per dopo). Questo potrebbe essere ottenuto con un'azione aggiuntiva in fase di analisi, che genererebbe codice per gestire la serializzazione automatica. Qualcuno ha mai sentito parlare di qualcosa del genere?Decapaggio in stile Python per C++?

risposta

7

Non credo che ci sia un modo per farlo in una lingua senza funzionalità di introspezione di runtime.

+0

Come dice Jacob di seguito, mi stavo chiedendo se qualcuno avesse visto uno strumento in fase di compilazione che potrebbe essere in grado di risolvere questo problema. Immagino che non ci sia niente del genere là fuori. –

+0

@RoniChoudhury A meno che non mi sbagli, la serializzazione Boost fa un buon lavoro viste le restrizioni del linguaggio. – Marcin

+0

@Marcin - Boost.Serialize fa davvero un buon lavoro, ma devi scrivere una funzione 'serialize()' che conosce i dettagli dell'oggetto che vuoi serializzare. – Ferruccio

1

C'è la serializzazione C++ standard con gli operatori < < e >>, anche se dovrai implementarli per ciascuna delle tue classi (che suona come non vuoi). Alcuni professionisti dicono che dovresti sempre implementare questi operatori, anche se, ovviamente, la maggior parte di noi raramente lo fa.

3

forse xml Associazione dati? gsoap è solo una delle molte opzioni. È possibile generare automaticamente il codice per il mapping tra struttura dati e schema xml. Non è sicuro che l'impostazione di questo sarebbe più facile di altre opzioni che si menzionano

0

Un modo rapido per fare ciò che ho funzionato una volta quando avevo bisogno di salvare una struttura in un file era di lanciare la mia struct su una matrice char e scrivere fuori in un file. Poi, quando volevo caricare di nuovo la mia struttura, leggevo l'intero file (in modalità binaria) e lanciavo l'intera cosa al tipo della mia struttura. Abbastanza facile e sfrutta il fatto che le strutture sono memorizzate come blocchi contigui in memoria. Non mi aspetto che questo funzioni con strutture dati o indicatori contorti, però, ma spunti di riflessione.

+2

Questa è una strategia di serializzazione vecchia ed estremamente _poor_ che fallirà in modo spettacolare in qualsiasi numero di condizioni, come ad esempio: diversi flag del compilatore, diverse versioni del compilatore, diverse CPU (nemmeno architetture necessariamente diverse!), Diversi sistemi operativi ... –

3

qualcosa che potrebbe automaticamente serializzare tutti i membri di una classe

Questo non è possibile in C++. Python, C#, Java et al. utilizzare l'introspezione run-time per raggiungere questo obiettivo. Non è possibile farlo in C++, RTTI non è abbastanza potente.

In sostanza, non c'è nulla nel linguaggio C++ che consentirebbe a qualcuno di scoprire le variabili membro di un oggetto in fase di esecuzione. Senza di ciò, non puoi serializzarli automaticamente.