XMLSerializable.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #ifndef IGL_XML_XMLSERIALIZABLE_H
  2. #define IGL_XML_XMLSERIALIZABLE_H
  3. #include "serialize_xml.h"
  4. #include "../igl_inline.h"
  5. #include "../serialize.h"
  6. #include <tinyxml2.h>
  7. // Interface for xml-serializable class see serialize_xml.h
  8. // Pretty sure all of these IGL_INLINE should be inline
  9. namespace igl
  10. {
  11. namespace xml
  12. {
  13. // interface for user defined types
  14. struct XMLSerializableBase : public SerializableBase
  15. {
  16. virtual void Serialize(std::vector<char>& buffer) const = 0;
  17. virtual void Deserialize(const std::vector<char>& buffer) = 0;
  18. virtual void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const = 0;
  19. virtual void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) = 0;
  20. };
  21. // Convenient interface for user defined types
  22. class XMLSerializable: public XMLSerializableBase
  23. {
  24. private:
  25. template <typename T>
  26. struct XMLSerializationObject: public XMLSerializableBase
  27. {
  28. bool Binary;
  29. std::string Name;
  30. T* Object;
  31. void Serialize(std::vector<char>& buffer) const {
  32. serialize(*Object,Name,buffer);
  33. }
  34. void Deserialize(const std::vector<char>& buffer) {
  35. deserialize(*Object,Name,buffer);
  36. }
  37. void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const {
  38. serialize_xml(*Object,Name,doc,element,Binary);
  39. }
  40. void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) {
  41. deserialize_xml(*Object,Name,doc,element);
  42. }
  43. };
  44. mutable bool initialized;
  45. mutable std::vector<XMLSerializableBase*> objects;
  46. public:
  47. // Override this function to add your member variables which should be serialized
  48. IGL_INLINE virtual void InitSerialization() = 0;
  49. // Following functions can be overridden to handle the specific events.
  50. // Return false to prevent the de-/serialization of an object.
  51. IGL_INLINE virtual bool PreSerialization() const;
  52. IGL_INLINE virtual void PostSerialization() const;
  53. IGL_INLINE virtual bool PreDeserialization();
  54. IGL_INLINE virtual void PostDeserialization();
  55. // Default implementation of XMLSerializableBase interface
  56. IGL_INLINE void Serialize(std::vector<char>& buffer) const;
  57. IGL_INLINE void Deserialize(const std::vector<char>& buffer);
  58. IGL_INLINE void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const;
  59. IGL_INLINE void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element);
  60. // Default constructor, destructor, assignment and copy constructor
  61. IGL_INLINE XMLSerializable();
  62. IGL_INLINE XMLSerializable(const XMLSerializable& obj);
  63. IGL_INLINE ~XMLSerializable();
  64. IGL_INLINE XMLSerializable& operator=(const XMLSerializable& obj);
  65. // Use this function to add your variables which should be serialized
  66. template <typename T>
  67. IGL_INLINE void Add(T& obj,std::string name,bool binary = false);
  68. };
  69. // IMPLEMENTATION
  70. IGL_INLINE bool XMLSerializable::PreSerialization() const
  71. {
  72. return true;
  73. }
  74. IGL_INLINE void XMLSerializable::PostSerialization() const
  75. {
  76. }
  77. IGL_INLINE bool XMLSerializable::PreDeserialization()
  78. {
  79. return true;
  80. }
  81. IGL_INLINE void XMLSerializable::PostDeserialization()
  82. {
  83. }
  84. IGL_INLINE void XMLSerializable::Serialize(std::vector<char>& buffer) const
  85. {
  86. if(this->PreSerialization())
  87. {
  88. if(initialized == false)
  89. {
  90. objects.clear();
  91. (const_cast<XMLSerializable*>(this))->InitSerialization();
  92. initialized = true;
  93. }
  94. for(unsigned int i=0;i<objects.size();i++)
  95. objects[i]->Serialize(buffer);
  96. this->PostSerialization();
  97. }
  98. }
  99. IGL_INLINE void XMLSerializable::Deserialize(const std::vector<char>& buffer)
  100. {
  101. if(this->PreDeserialization())
  102. {
  103. if(initialized == false)
  104. {
  105. objects.clear();
  106. (const_cast<XMLSerializable*>(this))->InitSerialization();
  107. initialized = true;
  108. }
  109. for(unsigned int i=0;i<objects.size();i++)
  110. objects[i]->Deserialize(buffer);
  111. this->PostDeserialization();
  112. }
  113. }
  114. IGL_INLINE void XMLSerializable::Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const
  115. {
  116. if(this->PreSerialization())
  117. {
  118. if(initialized == false)
  119. {
  120. objects.clear();
  121. (const_cast<XMLSerializable*>(this))->InitSerialization();
  122. initialized = true;
  123. }
  124. for(unsigned int i=0;i<objects.size();i++)
  125. objects[i]->Serialize(doc,element);
  126. this->PostSerialization();
  127. }
  128. }
  129. IGL_INLINE void XMLSerializable::Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)
  130. {
  131. if(this->PreDeserialization())
  132. {
  133. if(initialized == false)
  134. {
  135. objects.clear();
  136. (const_cast<XMLSerializable*>(this))->InitSerialization();
  137. initialized = true;
  138. }
  139. for(unsigned int i=0;i<objects.size();i++)
  140. objects[i]->Deserialize(doc,element);
  141. this->PostDeserialization();
  142. }
  143. }
  144. IGL_INLINE XMLSerializable::XMLSerializable()
  145. {
  146. initialized = false;
  147. }
  148. IGL_INLINE XMLSerializable::XMLSerializable(const XMLSerializable& obj)
  149. {
  150. initialized = false;
  151. objects.clear();
  152. }
  153. IGL_INLINE XMLSerializable::~XMLSerializable()
  154. {
  155. initialized = false;
  156. objects.clear();
  157. }
  158. IGL_INLINE XMLSerializable& XMLSerializable::operator=(const XMLSerializable& obj)
  159. {
  160. if(this != &obj)
  161. {
  162. if(initialized)
  163. {
  164. initialized = false;
  165. objects.clear();
  166. }
  167. }
  168. return *this;
  169. }
  170. template <typename T>
  171. IGL_INLINE void XMLSerializable::Add(T& obj,std::string name,bool binary)
  172. {
  173. XMLSerializationObject<T>* object = new XMLSerializationObject<T>();
  174. object->Binary = binary;
  175. object->Name = name;
  176. object->Object = &obj;
  177. objects.push_back(object);
  178. }
  179. }
  180. }
  181. #endif