What would be ideal is to have a library come in and have a look at the class and convert each field it to xml. (which apparently would be to much to hope for lol).
This is not possible in C++ today, though some proposals for the next upcoming version (C++17) may change this. For now, you need to explicitly tell external libraries about each field or write a custom serialization function that serializes the fields. A common idiom is something like:
void Serialize(Level& level, Serializer& serial) {
serial.Serialize("spriteList", level.spriteList);
serial.Serialize("sizeX", level.sizeX);
serial.Serialize("sizeY", level.sizeY);
serial.Serialize("tileSize", level.tileSize);
}
class Serializer {
public:
virtual void Serialize(const char* name, int& value) = 0;
virtual void Serialize(const char* name, float& value) = 0;
... other serializable type overloads ...
};
class XmlSerializeWriter final : public Serializer {
public:
void Serialize(const char* name, int& value) override { write_int_element(name, value); }
... etc ...
};
class SerializeReader final : public Serializer {
void Serialize(const char* name, int& value) override { value = read_int_element(name); }
... etc ...
};
XmlSerializeWriter writer{... initialize params, path, etc. ...};
Serialize(level, writer); // writes out an existing level
XmlSerializeReader reader{... initialize params, path, etc. ...};
Level level;
Serialize(level, reader); // reads in a level
With some work, you can handle containers (vector, deque, unordered_map, etc.), custom types, etc. Games typically work with a fairly restricted vocabulary of serializable types so it's not too bad.