// // 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/. #ifndef IGL_XML_SERIALIZATION_H #define IGL_XML_SERIALIZATION_H #include namespace igl { class XMLSerialization: public XMLSerializable { private: template struct XMLSerializationObject: public XMLSerializable { bool Binary; std::string Name; T* Object; void Serialize(std::vector& buffer) const { igl::serialize(*Object,Name,buffer); } void Deserialize(const std::vector& buffer) { igl::deserialize(*Object,Name,buffer); } void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const { igl::serialize_xml(*Object,Name,doc,element,Binary); } void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) { igl::deserialize_xml(*Object,Name,doc,element); } }; mutable bool initialized; mutable std::vector objects; public: /** * Override this function to add your member variables which should be * serialized: * * this->Add(var1); * this->Add(var2); * ... */ virtual void InitSerialization() = 0; /** * Following functions can be overridden to handle the specific events. * Return false to prevent the de-/serialization of an object. */ virtual bool BeforeSerialization() const { return true; } virtual void AfterSerialization() const {} virtual bool BeforeDeserialization() { return true; } virtual void AfterDeserialization() {} /** * Default implementation of XMLSerializable interface */ void Serialize(std::vector& buffer) const { if(this->BeforeSerialization()) { if(initialized == false) { objects.clear(); (const_cast(this))->InitSerialization(); initialized = true; } for(int i=0;iSerialize(buffer); this->AfterSerialization(); } } void Deserialize(const std::vector& buffer) { if(this->BeforeDeserialization()) { if(initialized == false) { objects.clear(); (const_cast(this))->InitSerialization(); initialized = true; } for(int i=0;iDeserialize(buffer); this->AfterDeserialization(); } } void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const { if(this->BeforeSerialization()) { if(initialized == false) { objects.clear(); (const_cast(this))->InitSerialization(); initialized = true; } for(int i=0;iSerialize(doc,element); this->AfterSerialization(); } } void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) { if(this->BeforeDeserialization()) { if(initialized == false) { objects.clear(); (const_cast(this))->InitSerialization(); initialized = true; } for(int i=0;iDeserialize(doc,element); this->AfterDeserialization(); } } /** * Default constructor, destructor, assignment and copy constructor */ XMLSerialization() { initialized = false; } XMLSerialization(const XMLSerialization& obj) { initialized = false; objects.clear(); } ~XMLSerialization() { initialized = false; objects.clear(); } XMLSerialization& operator=(const XMLSerialization& obj) { if(this != &obj) { if(initialized) { initialized = false; objects.clear(); } } return *this; } /** * Use this function to add your variables which should be serialized. */ template void Add(T& obj,std::string name, bool binary = false) { XMLSerializationObject* object = new XMLSerializationObject(); object->Binary = binary; object->Name = name; object->Object = &obj; objects.push_back(object); } }; } #endif