// // Copyright (C) 2014 Christian Schüller // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. ------------------------------------------------------------------------------ Inherit from this class to have the easiest way to serialize your user defined class. 1) Pass the default name of your class to the base constructor. 2) Override InitSerialization() and add your variables to serialize like: xmlSerializer->Add(var1,"name1"); xmlSerializer->Add(var2,"name2"); Workaround for Visual Studio run time debugger inspection problem: Copy and implement all the functions, splitting them into a source and header file. Restrictions on Native C++ Expressions (Anonymous Namespaces): http://msdn.microsoft.com/en-us/library/0888kc6a%28VS.80%29.aspx ----------------------------------------------------------------------------*/ #ifndef IGL_XML_SERIALIZATION_H #define IGL_XML_SERIALIZATION_H #include namespace igl { namespace { class XMLSerializer; class XMLSerialization : public igl::XMLSerializable { public: XMLSerializer* xmlSerializer; /** * Default implementation of XMLSerializable interface */ virtual void Init(); virtual bool Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element); virtual bool Deserialize(tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element); /** * Default constructor, destructor, assignment and copy constructor */ XMLSerialization(const std::string& name); ~XMLSerialization(); XMLSerialization(const XMLSerialization& obj); XMLSerialization& operator=(const XMLSerialization& obj); /** * Function which must be overridden in the subclass if you don't use * heap allocations (new) to create new instances. * It will get called if the assignment operator or copy constructor * is involved to update the references to the new copied data structures * * Add in this function all the variables you want to serialize like: * xmlSerializer->Add(var1); * xmlSerializer->Add(var2); * ... */ virtual void InitSerialization(); /** * Following functions can be overwritten to handle the specific events. * Return false to prevent serialization of object. */ virtual bool BeforeSerialization(); virtual void AfterSerialization(); virtual bool BeforeDeserialization(); virtual void AfterDeserialization(); private: void initXMLSerializer(); }; // Implementation void XMLSerialization::Init() { } bool XMLSerialization::Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) { bool serialized = false; if(this->BeforeSerialization()) { if(xmlSerializer==NULL) { xmlSerializer = new XMLSerializer(Name); this->InitSerialization(); } serialized = xmlSerializer->SaveGroupToXMLElement(doc,element,Name); this->AfterSerialization(); } return serialized; } bool XMLSerialization::Deserialize(tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) { bool serialized = false; if(this->BeforeDeserialization()) { if(xmlSerializer==NULL) { xmlSerializer = new XMLSerializer(Name); this->InitSerialization(); } serialized = xmlSerializer->LoadGroupFromXMLElement(Name,doc,element); this->AfterDeserialization(); } return serialized; } void XMLSerialization::InitSerialization() { std::cout<<"You have to override InitSerialization()"<<"\n"; //assert(false); } XMLSerialization::XMLSerialization(const std::string& name) { Name = name; xmlSerializer = NULL; } XMLSerialization::~XMLSerialization() { if(xmlSerializer!=NULL) delete xmlSerializer; xmlSerializer = NULL; } XMLSerialization::XMLSerialization(const XMLSerialization& obj) { Name = obj.Name; xmlSerializer = NULL; } XMLSerialization& XMLSerialization::operator=(const XMLSerialization& obj) { if(this!=&obj) { Name = obj.Name; if(xmlSerializer!=NULL) { delete xmlSerializer; xmlSerializer = NULL; } } return *this; } bool XMLSerialization::BeforeSerialization() { return true; } void XMLSerialization::AfterSerialization() { } bool XMLSerialization::BeforeDeserialization() { return true; } void XMLSerialization::AfterDeserialization() { } } } #endif