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?

2 Answers 2

16

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)
Sign up to request clarification or add additional context in comments.

Comments

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).

3 Comments

Do you know of an example of using Xerces to generate the type of output @navigator wants?
Why do you say that's not the intended usage? The docs disagree with you: «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.»
@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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.