The serialization description file contains the class with data to be serialized:
// book.xmlser: enum Color { black, white, blue } class Book { string name; string isbn; string author; int published; string publisher; float price; Color color; }
I have used extensions .xmlser and .xml-schema for these kind of files.
The next step is to run the xmlsergen tool with serialization description file as input:
>xmlsergen -v book.xmlser > book.xmlser ==> book.hpp ==> book.cpp
The xmlsergen tool generates XML serializable C++ classes from classes in the serialization description file and puts their definitions to the generated .cpp and .hpp files.
Because the XML serialization library uses C++ concepts that are recently added to the C++ standard, the program should be compiled with /std:c++20.
The main program:
// object: main.cpp: #include <book.hpp> #include <sngxml/dom/Document.hpp> #include <sngxml/dom/Parser.hpp> #include <sngxml/xpath/InitDone.hpp> #include <soulng/util/InitDone.hpp> #include <soulng/util/Unicode.hpp> #include <iostream> void InitApplication() { soulng::util::Init(); sngxml::xpath::Init(); } void DoneApplication() { sngxml::xpath::Done(); soulng::util::Done(); } int main() { try { InitApplication(); Book book; book.name = "The C++ Programming Language, 4th Edition"; book.isbn = "0-321-56384-0"; book.author = "Bjarne Stroustrup"; book.published = 2013; book.publisher = "Pearson Education"; book.price = 61.88f; book.color = Color::blue; std::unique_ptr<sngxml::dom::Element> element = book.ToXml("book"); sngxml::dom::Document doc; doc.AppendChild(std::unique_ptr<sngxml::dom::Node>(element.release())); std::stringstream strStream; soulng::util::CodeFormatter formatter(strStream); doc.Write(formatter); std::string str = strStream.str(); std::cout << str << std::endl; std::u32string content = soulng::unicode::ToUtf32(str); std::unique_ptr<sngxml::dom::Document> docRead = sngxml::dom::ParseDocument(content, "string"); Book bookRead; bookRead.FromXml(docRead->DocumentElement()); std::cout << bookRead.name << std::endl; } catch (const std::exception& ex) { std::cerr << ex.what() << std::endl; return 1; } DoneApplication(); return 0; }
The output of the program looks like this:
<book classId="-1" className="Book" objectId="00000000-0000-0000-0000-000000000000"> <name value="The C++ Programming Language, 4th Edition"/> <isbn value="0-321-56384-0"/> <author value="Bjarne Stroustrup"/> <published value="2013"/> <publisher value="Pearson Education"/> <price value="61.880001"/> <color value="2"/> </book> The C++ Programming Language, 4th Edition