2010-09-08 8 views
12

Utilizzando la libreria Boost serializzazione ho una funzione molto semplice serialize() membro, qualcosa di simile:Come distinguere le operazioni di lettura/scrittura nella serializzazione boost?

template <class Archive> 
    void serialize(Archive& ar, unsigned version) 
    { 
    ar & m_Searcher; 
    } 

... e voglio mantenerlo questo semplice (non voglio usare la scissione in particolare). Ma nel caso della scrittura, voglio fare un po 'di "preparazione" per m_Searcher prima che la scrittura vera e propria abbia luogo.

{ 
    if(this-is-a-writing-operation) 
    do-some-preparation(m_Searcher) 

    ar & m_Searcher; 
} 

C'è un modo semplice per distinguere tra operazioni di lettura e scrittura?

+0

se non ti dispiace dividere la logica in due funzioni, dai un'occhiata a http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar

risposta

24

Penso che si possa fare questo senza scissione, che sarebbe il solito modo:

if (Archive::is_saving::value) 
    doSomething(); 

Questa è ereditata dall'interfaccia di base che gli archivi uso, in boost/archive/detail/interface_[ia]archive.hpp

Il codice seguente dimostra che sembra essere una soluzione ragionevole con 1,42

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 

// oarchive: 
//text 
static_assert(!boost::archive::text_oarchive::is_loading::value, "out is loading"); 
static_assert(boost::archive::text_oarchive::is_saving::value, "out isn't saving"); 

//xml 
static_assert(!boost::archive::xml_oarchive::is_loading::value, "out is loading"); 
static_assert(boost::archive::xml_oarchive::is_saving::value, "out isn't saving"); 

// iarchive: 
//text 
static_assert(boost::archive::text_iarchive::is_loading::value, "out is loading"); 
static_assert(!boost::archive::text_iarchive::is_saving::value, "out isn't saving"); 

//xml 
static_assert(boost::archive::xml_iarchive::is_loading::value, "out is loading"); 
static_assert(!boost::archive::xml_iarchive::is_saving::value, "out isn't saving"); 

sarei un po 'cauto di basarsi su qualcosa di simile anche se - più in l'eredità potrebbe spezzarla se qualcuno ha scritto un archivio che fa sia input che output e non mi è chiaro quanto sia permenente e pubblica questa parte dell'interfaccia.

+0

Come alcuni tipo di protezione contro il suddetto problema con l'eventuale archivio bidirezionale si può aggiungere 'static_assert (Archive :: is_saving :: value! = Archive :: is_loading :: value);' –

Problemi correlati