2010-08-11 25 views
12

Esta es una pregunta para principiantes. Estoy tratando de serializar algunos objetos a XML, pero el XML resultante contiene una firma de serialización boost, información de versión, identificación de clase, ... etc. que no necesito ¿Hay alguna manera de deshacerse de ellos sin procesar el mensaje xml?Serializar a XML usando boost :: serialization

#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; 
} 

resultados en:

<?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> 

voy a ser la serialización de estos mensajes en cadenas, sin embargo, y enviarlos al sistema que se crea un mensaje a este aspecto.

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

¿Hay alguna manera de serializar xml sin la firma?

Respuesta

1

No es para lo que se debe usar boost::serialization. Si está buscando generar un tipo específico de XML, mejor use un generador XML como Xerces (sí, dice "analizador" en todas partes, pero también escribirá XML).

+0

¿Conoce un ejemplo del uso de Xerces para generar el tipo de salida de @navigator quiere? – Jeff

+1

¿Por qué dices que no es el uso previsto? Documentos [en desacuerdo] (http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html): «Esta biblioteca será útil en otros contextos además de implementar la persistencia . El caso más obvio es el de ordenar los datos para su transmisión a otro sistema. » –

15

la bandera no_header elimina las líneas de encabezamiento

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

la siguiente macro elimina los atributos

BOOST_CLASS_IMPLEMENTATION(Test, object_serializable)