come da manuale utilizzo QDataStream per serializzare delle mie strutture eseguendo l'overload degli operatori >> / << e gestendo a mano ciascun elemento della struttura.
Il tutto ovviamente funziona ma è scomodo perché costringe a creare un overload per ogni struttura da serializzare, con conseguente difficoltosa manutenzione in caso di modifiche.
Dal momento che gli elementi "foglia" di ciascuna struttura sono direttamente digeribili da QDataStream, mi chiedo se c'è un modo furbo per processare automaticamente le strutture (anche annidate). In pratica le difficoltà sono quelle di esplorare la struttura e individuare i tipi di dato.
Che io sappia non si può fare in C++ perché a run-time non si è a conoscenza del tipo di dato presente in memoria. Una soluzione ugualmente poco pratica (ma più facilmente manutenibile) è associare a una struttura la sua descrizione in termini di tipo di dato (enum) e offset rispetto alla prima locazione. La funzione di serializzazione seguendo l'elenco di questa descrizione è quindi in grado di puntare correttamente a ciascun elemento.
E' tempo perso o si può tirar fuori qualcosa di decente?
L'idea finale è di scrivere del codice leggibile, tipo questo:
- Codice: Seleziona tutto
struct myStruct1 {
int a;
QString b;
float[3] c;
}
struct myStruct2 {
bool a;
int[5] b;
QString c;
}
myStruct1 s1;
myStruct2 s2;
QByteArray msg;
QDataStream stream(&msg, QIODevice::WriteOnly);
stream << s1 << s2;
Ciao!
