16

This is a newbie question. I am trying to serialize some objects to XML, but the resulting XML contains a boost serialization signature, version information, class id, ...etc. that I do not need. Is there a way to get rid of them without post-processing the xml message?

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

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

I'll be serializing these messages to strings, though, and sending them to systems that expect a message to look like this.

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

Is there a way to serialize xml without the signature?

Trevor Hickey
  • 36,288
  • 32
  • 162
  • 271
navigator
  • 1,588
  • 1
  • 13
  • 19

2 Answers2

17

the flag no_header eliminates the heading lines

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

the following macro eliminates the attributes

BOOST_CLASS_IMPLEMENTATION(Test, object_serializable)
stefan
  • 3,681
  • 15
  • 25
2

That is not what boost::serialization should be used for. If you're looking to generate a specific type of XML, better use an XML generator like Xerces (yes, it says "parser" everywhere, but it'll also write XML).

Ivo
  • 3,481
  • 1
  • 25
  • 29
  • Do you know of an example of using Xerces to generate the type of output @navigator wants? – Jeff May 29 '14 at 16:11
  • 1
    Why do you say that's not the intended usage? The docs [disagree with you](http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/index.html): «`This library will be useful in other contexts besides implementing persistence. The most obvious case is that of marshalling data for transmission to another system.`» – Fabio A. May 09 '16 at 23:41
  • @FabioA. With that they probably mean, using boost serialize on both sides. In that case it is not persistence, but transmission; yet - the format is still boost serialization specific. I find it impossible to beat the format into the format that I need using boost serialization, so I think this is the correct answer. – Carlo Wood Feb 12 '21 at 06:14