2010-08-11 15 views
12

Questa è una domanda newbie. Sto cercando di serializzare alcuni oggetti in XML, ma l'XML risultante contiene una firma di serializzazione boost, informazioni sulla versione, id di classe, ecc. che non ho bisogno. C'è un modo per sbarazzarsi di loro senza post-elaborazione del messaggio xml?Serialize a XML usando boost :: serializzazione

#include <fstream> 
#include <iostream> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/archive/xml_oarchive.hpp> 

using namespace std; 

class Test { 
private:  
    friend class boost::serialization::access; 
    template<class Archive> void serialize(Archive & ar, 
      const unsigned int version) { 
     ar & BOOST_SERIALIZATION_NVP(a); 
     ar & BOOST_SERIALIZATION_NVP(b); 
     ar & BOOST_SERIALIZATION_NVP(c); 
    } 

    int a; 
    int b; 
    float c; 
public: 
    inline Test(int a, int b, float c) { 
     this->a = a; 
     this->b = b; 
     this->c = c; 
    } 
}; 

int main() { 
    std::ofstream ofs("filename.xml"); 

    Test* test = new Test(1, 2, 3.3); 

    boost::archive::xml_oarchive oa(ofs); 
    oa << BOOST_SERIALIZATION_NVP(test); 

    return 0; 
} 

risultati in:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <!DOCTYPE boost_serialization (View Source for full doctype...)> 
    <boost_serialization signature="serialization::archive" version="6"> 
    <test class_id="0" tracking_level="1" version="0" object_id="_0"> 
    <a>1</a> 
    <b>2</b> 
    <c>3.3</c> 
    </test> 
    </boost_serialization> 

sarò serializzazione questi messaggi in stringhe, però, e di inviarli a sistemi che si aspettano un messaggio a guardare come questo.

<test> 
    <a>1</a> 
    <b>2</b> 
    <c>3.3</c> 
    </test> 

C'è un modo per serializzare xml senza la firma?

risposta

1

Non è quello che boost::serialization deve essere utilizzato per. Se stai cercando di generare un tipo specifico di XML, meglio utilizzare un generatore di XML come Xerces (sì, si dice "parser" in tutto il mondo, ma sarà anche scrivere XML).

+0

Sei a conoscenza di un esempio di utilizzo Xerces per generare il tipo di uscita @navigator vuole? – Jeff

+1

Perché dici che non è l'uso previsto? La documentazione [in disaccordo con te] (http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html): «' Questa libreria sarà utile in altri contesti oltre a implementare la persistenza . Il caso più ovvio è quello di effettuare il marshalling dei dati per la trasmissione ad un altro sistema. » –

15

bandiera no_header elimina le righe di intestazione

unsigned int flags = boost::archive::no_header; 
boost::archive::xml_oarchive oa(ofs, flags); 

la seguente macro elimina gli attributi

BOOST_CLASS_IMPLEMENTATION(Test, object_serializable)