
Following code results in "unrecognized XML syntax" exception while writing to XML file. However if I change xml_oarchive to text_oarchive or binary_oarchive, it works fine, so I assume it's a bug in xml_oarchive ??? Does any one know how to fix this for xml_oarchive ??? #include <iostream> #include <fstream> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp> #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/map.hpp> #include <vector> #include <map> #include <boost/archive/archive_exception.hpp> #include <boost/archive/basic_xml_archive.hpp> class base { protected : std::vector<int> vec; protected : friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(vec); } public : void add(int i) { vec.push_back(i); } int get(int idx) { return vec[idx]; } }; class derived : public base { friend class boost::serialization::access; std::map<std::string, int> hmap; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<base>(*this)); ar & BOOST_SERIALIZATION_NVP(hmap); } public : void add(std::string str, int i) { hmap[str] = i; base::add(i); } int get(std::string str) { return hmap[str]; } }; int main(int argc, char* argv[]) { try { derived A; A.add("First", 12); A.add("Second", 34); const derived AA = A; std::ofstream ofs("Test.xml"); assert(ofs.good()); boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(AA); ofs.close(); derived B; std::ifstream ifs("Test.xml"); assert(ifs.good()); boost::archive::xml_iarchive ia(ifs); ia >> BOOST_SERIALIZATION_NVP(B); ifs.close(); } catch (boost::archive::xml_archive_exception ex) { std::cerr << " X " << ex.what() << std::endl; } catch (boost::archive::archive_exception ex) { std::cerr << " A " << ex.what() << std::endl; } catch (std::exception ex) { std::cerr << " E " << ex.what() << std::endl; } catch (...) { std::cerr << "Unknown Exception " << std::endl; } return 0; }