2010-09-08 8 views
12

Mit der Boost-Serialisierung Bibliothek ich eine sehr einfache serialize() Memberfunktion haben, so etwas wie:Wie unterscheidet man den Lese-/Schreibvorgang in der Boost-Serialisierung?

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

... und ich möchte es halten diese einfache (ich will nicht Splitting insbesondere verwenden). Aber im Fall des Schreibens möchte ich eine "Vorbereitung" für m_Searcher machen, bevor das eigentliche Schreiben stattfindet.

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

    ar & m_Searcher; 
} 

Gibt es eine einfache Möglichkeit, zwischen Lese- und Schreiboperationen zu unterscheiden?

+0

Wenn es Ihnen nichts ausmacht, die Logik in zwei Funktionen zu teilen, werfen Sie einen Blick auf http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#splitting – Ammar

Antwort

24

Ich glaube, Sie dies ohne Splitting tun, was der übliche Weg wäre:

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

Diese von der Basis-Schnittstelle, die die Verwendung Archiv geerbt wird, in boost/archive/detail/interface_[ia]archive.hpp

Der folgende Code zeigt, dass es scheint, mit 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"); 

eine vernünftige Lösung zu sein ich so aber ein bisschen vorsichtig, sich auf etwas sein würde - mehrere in Heritance könnte es brechen, wenn jemand ein Archiv schrieb, das sowohl Eingabe als auch Ausgabe und tut es mir nicht klar ist, wie dauerhaft und öffentlich dieser Teil der Schnittstelle gemeint ist.

+0

Als einige Art des Schutzes gegen das oben erwähnte Problem mit dem möglichen bidirektionalen Archiv kann man 'static_assert hinzufügen (Archive :: is_saving :: value! = Archive :: is_loading :: value);' –

Verwandte Themen