2010-09-08 5 views
12

El uso de la biblioteca impulso serialización Tengo una función muy simple serialize() miembro, algo así como:¿Cómo distinguir la operación de lectura/escritura en la serialización de impulso?

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

... y yo quiero seguir esta sencilla (no quiero usar la división en particular). Pero en el caso de la escritura, quiero hacer un poco de "preparación" para m_Searcher antes de que tenga lugar la escritura real.

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

    ar & m_Searcher; 
} 

¿Hay alguna forma simple de distinguir entre operaciones de lectura y escritura?

+0

si no te importa dividir la lógica en dos funciones, mira http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar

Respuesta

24

Creo que se puede hacer esto sin división, lo que sería la forma habitual:

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

Esto se hereda de la interfaz de la base de que el uso de Archivos, en boost/archive/detail/interface_[ia]archive.hpp

El código siguiente muestra que parece ser una solución razonable 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"); 

me gustaría ser un poco prudente de confiar en algo como esto, aunque - en múltiples la herencia podría romperlo si alguien escribió un archivo que hace tanto entrada como salida y, no me queda claro cuán permanente y pública debe ser esta parte de la interfaz.

+0

Como algunos tipo de control de protección contra el problema antes mencionado con el posible archivo bidireccional uno puede agregar 'static_assert (Archive :: is_saving :: value! = Archive :: is_loading :: value);' –

Cuestiones relacionadas