Serializzazione dei messaggi di rete

3

Sto scrivendo un wrapper di rete intorno a boost::asio e mi chiedevo quale sia un modo semplice e buono per serializzare i miei messaggi. Ho una fabbrica di messaggi che può occuparsi di inviare i dati al costruttore corretto, ma voglio sapere se ci sono soluzioni stabilite per ottenere i dati binari dal lato del mittente e di conseguenza passare i dati per la deserializzazione sul lato ricevitore.

Alcune opzioni che ho esplorato sono: passare un puntatore a char[] alle funzioni serialize / deserialize (per serializzare su cui scrivere e deserializzare per leggere da), ma è difficile imporre la dimensione del buffer in questo modo; Basandomi su questo, ho deciso di far restituire alla funzione serialize un boost::asio::mutable_buffer , tuttavia la proprietà della memoria diventa sfocata tra più classi, poiché il wrapper di rete ha bisogno di ripulire la memoria allocata dal generatore di messaggi.

Ho visto anche soluzioni che coinvolgono streambuf e stringstream , ma manipolare i dati binari in termini di rappresentazione delle stringhe è qualcosa che voglio evitare. È possibile utilizzare una sorta di flusso binario? Quello che sto cercando è una soluzione (preferibilmente usando le librerie boost) che consente al costruttore di messaggi di dettare la quantità di memoria allocata durante la serializzazione e come apparire in termini di trasmissione dei dati tra il wrapper ei produttori di messaggi / fabbrica di messaggi.

PS. I messaggi contengono quasi esclusivamente tipi built-in e POD e formano una gerarchia superficiale ma ampia per il gusto di passare attraverso una fabbrica.

Nota: un collegamento ad esempi di utilizzo di boost::serialization per qualcosa di simile sarebbe apprezzato visto che ho difficoltà a capire la relazione tra questo e i buffer.

    
posta mtsvetkov 24.09.2012 - 13:54
fonte

1 risposta

2

Dato che non puoi avere la tua torta e mangiarla (vedi la discussione del commento per la domanda), ho deciso sulla seguente soluzione:

Il wrapper di rete manterrà un boost::asio::streambuf , mentre la serializzazione / deserializzazione avverrà su ostream / istream . In questo modo i creatori di messaggi non devono occuparsi della gestione della memoria, possono usare tanto / quanto poco di cui hanno bisogno e possono scegliere se desiderano serializzare come binari o testo. Come ulteriore vantaggio, posso anche serializzare facilmente i messaggi in / deserialize da un file per la registrazione / riproduzione durante il debug.

    
risposta data 25.09.2012 - 14:17
fonte

Leggi altre domande sui tag