Вот такой код: Код (Text): #include <boost/archive/xml_oarchive.hpp> using namespace boost::archive; struct request { std::wstring path; std::string mask; template<class Archive> void serialize(Archive& ar, unsigned int const version) { ar & BOOST_SERIALIZATION_NVP(path); ar & BOOST_SERIALIZATION_NVP(mask); } }; int main() { xml_oarchive oa(std::cout); request req; req.path = L"C:\\WINDOWS\\system32\\"; req.mask = "*.exe"; oa << BOOST_SERIALIZATION_NVP(req); return 0; } Выдает такой аутпут: Код (Text): <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE boost_serialization> <boost_serialization signature="serialization::archive" version="5"> <req class_id="0" tracking_level="0" version="0"> <path>C:\WINDOWS\system32\</path> <mask>*.exe</mask> </req> </boost_serialization> Вопросы: 1. Как поставить свой !DOCTYPE 2. Как переименовать boost_serialization и убрать/добавить ее атрибуты? 3. Как убать/добавить атрибуты объекта?
boost/archive/impl/basic_xml_oarchive.hpp: Код (Text): template<class Archive> BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) basic_xml_oarchive<Archive>::init(){ // xml header this->This()->put("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"); this->This()->put("<!DOCTYPE boost_serialization>\n"); // xml document wrapper - outer root this->This()->put("<boost_serialization"); write_attribute("signature", ARCHIVE_SIGNATURE()); write_attribute("version", ARCHIVE_VERSION()); this->This()->put(">\n"); }
Судя по тому что значения захардкожены и тому, что CRTP не даст написать специализацию, единственным выходом остается правка исходника. Мда...